Quale libreria per ocre o alberi kd? [chiuso]


8

Esistono librerie robuste per l'indicizzazione di oggetti?

Gli oggetti si sarebbero limitati, anziché essere rappresentati da punti; e un oggetto potrebbe quindi trovarsi in più di un compartimento se l'indice divide le cose in partizioni di dimensioni fisse.

Avrebbe bisogno di abbattere frustum e visitare oggetti colpiti da un raggio, nonché ricerche di quartiere.

Riesco a trovare molti articoli che mostrano la matematica per le parti componenti, spesso come algebra piuttosto che semplice C, ma nulla che mette tutto insieme (a parte forse Ogre, anche se a quanto pare PyOrge non espone l'ottava ). Sicuramente i produttori di giochi per hobby non devono tutti fare i propri indici spartiali?

(Mi siedo e scrivo la mia sfera-sfera, sfera-raggio, raggio-aabb, cono-aabb, cono-fustrum, aabb-fustrum e implementazione dell'octree; sicuramente c'è un modo migliore, cioè qualcuno ha già fatto questo e ha fatto un bel pacchetto?!?!)

(Preferito Python o C / C ++ con attacchi)

Risposte:


10

Sicuramente i produttori di giochi per hobby non devono tutti fare le proprie occhiate?

A meno che non stiano usando qualcosa di più grande (come Ogre o un altro motore di fisica / rendering), molti lo fanno. Un octree è una struttura abbastanza semplice da implementare e ci sono molti compromessi:

  • L'otto è invadente o no? Se è invadente, si ottengono migliori prestazioni della cache, ma strutture più grandi.
  • Se non è invadente, memorizza puntatori o una sorta di handle sicuro?
  • È memorizzato piatto o con puntatori figlio?
  • Quanto è sicuro? Se utilizza modelli, sarà molto più sicuro con un sovraccarico minimo di runtime, ma molto più difficile da associare a Python.
  • Qualsiasi ottetto con interrogazione spaziale dovrà includere un tipo di tipo vettoriale / punto / raggio e qualsiasi cosa con abbattimento del frustum includerà un frustum e routine matematiche di matrice. Scrivere il codice per interfacciarlo con la dozzina di classi di matrici / vettori che hai già trascinato da tutte le altre librerie che stai usando in realtà richiede meno lavoro rispetto alla semplice scrittura dell'ottetto di base che desideri?
  • È sicuro per i thread?

Detto questo, ci sono molte implementazioni octree online . Non dare per scontato che afferrarne uno ti farà risparmiare molto lavoro, e non dare per scontato che esista un unico vero modo per creare una struttura di dati diversa da un array.


Bella intuizione! Mi chiedo come sia per gli alberi KD, quello che ho visto da loro è che sono belli da implementare (ci sono molti dettagli difficili da prendere in considerazione). Forse qualcuno ne sa di più?
Nef,

Gli alberi kd sono davvero più difficili da implementare? Penso che siano più difficili da ragionare, soprattutto senza disegnare immagini, perché dividono la geometria in un modo meno intuitivo. Ma gli algoritmi di costruzione / interrogazione di base non sono in realtà più lunghi o meno esplorati rispetto all'ottavo.

2
Un Octree è in realtà solo un caso speciale KD-tree. Con piani di divisione a posizione fissa. Implementando alberi KD avrai bisogno di un modo per trovare il tuo "migliore" offset di divisione dell'asse per nodo.
Annullare il

2

Ad essere onesti, il Python Octree collegato è stato pubblicato nel 2006, quindi Python-Ogre potrebbe benissimo aver esposto la classe Octree ormai.

Tuttavia, guardando attraverso le fonti Ogre, posso vedere due implementazioni di Octree: una dentro Plugins/OctreeSceneManager/OgreOctree.he una dentro Plugins/OctreeZone/OgreOctreeZoneOctree.h.

Se mi indichi a quello di cui hai bisogno di essere esposto, lo inserirò nell'elenco dei todo per il mio wrapper Python scritto a mano (è disponibile su bitbucket, collegato nel mio profilo).

Comunque buona fortuna. : D


è un'offerta molto gentile; Ho ahem già scritto il mio però.
Will

1

Ho trovato un po 'di codice per un'implementazione octree di Python qui , semplicemente cercando su' octree python '. ; D

Non dipende dalla libreria (sebbene sia stata originariamente scritta per PyOgre) ed è ben commentata.


Una cosa che ho trovato negli occhialini di Python puro è che l'overhead aggiuntivo per le chiamate di funzione per l'attraversamento di alberi domina rapidamente il tuo runtime e li rende peggiori delle semplici ricerche negli elenchi, per qualsiasi quantità di oggetti che potresti elaborare in pure-Python comunque. Anche quel particolare esempio sembra molto non ottimizzato.

Mentre questo è un bel po 'di codice da digerire se dovessi creare il tuo ottetto, fuori dalla scatola in quell'ottetto mancano tutte le caratteristiche - ad esempio l'intersezione raggio e fustrum - che ho citato nella domanda. In realtà, non ha nemmeno la ricerca del vicino più vicino. Mi chiedo per cosa usano quell'ottetto, se riescono a inserire i dati senza interrogarli se non per punto esatto? E memorizza punti, piuttosto che cose con limiti. Elenco tutte queste carenze perché questo è indicativo di tutti gli occhioni di pitone che ho trovato sul web; forse altri possono trovare un octree più completo su google? Non posso :(
Will

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.