Cuando se utiliza un octree para la detección de colisiones en un juego, ¿debería reconstruirse el árbol en cada cuadro o hay una manera mejor asumiendo que la mitad de los objetos se mueven en un marco?¿Se debería reconstruir un octárbol en cada cuadro?
Respuesta
Si la escena cambia con cada fotograma, debe volver a hacer el árbol.
Si tiene mucha geometría estática en sus escenas, considere construir octrees por separado. También podría expresar la misma idea teniendo nodos de hoja más complicados que diferencien entre geometría estática y no estática.
Conclusión: solo regenere lo que tenga que hacer.
Si tiene datos muy dinámicos moviendo cada fotograma y aún necesita acelerar la detección de colisiones, en realidad recomiendo usar una red 3D fija para ello. equivalente de 2 dimensiones:
También puede duplicar el control como una lista libre para permitir el traslado a tiempo constante, al igual que (utilizando el índice next
ya sea como un índice para el siguiente elemento en la misma celda de la cuadrícula o el siguiente elemento libre para que aparezca fuera de la pila libre si se ha eliminado):
Otro ejemplo:
Ahora en 3 dimensiones, esto podría parecer que requeriría memoria explosiva. Sin embargo, el truco consiste en hacer que cada célula almacene un índice de 32 bits en una matriz y, básicamente, sirva como una lista de índices vinculados individualmente. Eso reduce el tamaño de cada celda a 32 bits. Ahora, si almacena una cuadrícula de 100x100x100 (1 millón de celdas), eso tomaría menos de 4 megabytes.
Cuando los elementos se mueven, puede eliminarlos de las celdas que ocupan, moverlos e insertarlos en las celdas nuevas. Todo lo que tiene que hacer para hacer esto es manipular algunos índices de 32 bits (sin asignación/desasignación de memoria para transferir elementos de un conjunto de celdas a otros). Esto es todo de tiempo constante y no requiere reequilibrar árboles o dividir octantes que se llenen demasiado o algo por el estilo.
También puede usar una jerarquía de grillas (esto puede sonar como un octárbol pero diferente). Lo que quiero decir con eso es que podrías tener una grilla gruesa para objetos de malla completa en tu escena. Entonces, cada objeto de malla puede almacenar una grilla gruesa, digamos, 10x10x10, para cada una de sus partes. Luego, cada parte almacena una cuadrícula fina o un octárbol para cada uno de sus polígonos. Esto permite mallas no orgánicas que son, por ejemplo, rígidas con partes que giran como un robot para evitar tener que actualizar la cuadrícula fina/octárbol de polígonos y simplemente actualizar su propia grilla gruesa de partes y la gruesa grilla de objetos del mundo cuando comienza a girar sus piernas y brazos, por ejemplo Solo los modelos orgánicos necesitan actualizar sus redes finas cuando se deforman con huesos, p.
El octree que mantendría para sus elementos completamente estáticos/partes que nunca necesitan ser actualizadas por cuadro y usaría un bonito octárbol, escaso con tal vez un poco de procesamiento posterior para el acceso a la memoria de caché. Tiene un poco más de tiempo disponible para acelerar las búsquedas y minimizar el uso de la memoria si puede suponer que el octárbol no necesita actualizarse una vez que se haya construido.
- 1. teniendo que reconstruir en VS 2010 después de cada modificación
- 2. ¿Debería cada clase tener un destructor virtual?
- 3. ¿Debería tener NSFetchedResultsController en cada vista?
- 4. ¿Debería IDataErrorInfo.Error verificar cada propiedad?
- 5. Información sobre herramientas para cada elemento en un cuadro combinado
- 6. ¿Por qué VS tiene que reconstruir TODOS mis proyectos cada vez que pulso "Reproducir"?
- 7. ¿Debería poner un bloque try-finally después de cada Object.Create?
- 8. ¿Se debería incluir autogen.sh en un tarball?
- 9. siempre hacen reconstruir
- 10. Reconstruir la plantilla T4 cuando se modifica el archivo externo
- 11. ¿Cómo reconstruir Visual Studio Toolbox?
- 12. Reorganizar y reconstruir índices automáticamente
- 13. Cómo reconstruir vista en SQL Server 2008
- 14. Forzar visual studio para siempre 'reconstruir todo' cuando se depura
- 15. ¿Cómo obtengo la base de datos de prueba Rails para reconstruir antes de cada prueba?
- 16. ¿Debería cada derivación posible en un método tener un junit separado?
- 17. Cómo fuerza un archivo MAKE a reconstruir un objetivo
- 18. Cómo reconstruir VS2010 IDE Intellisense?
- 19. Metodología de interfaces Java: ¿Debería cada clase implementar una interfaz?
- 20. ¿Debería cada clase tener su propio espacio de nombres?
- 21. Un rastreador web en python. ¿Dónde debería comenzar y qué debería seguir? - Se necesita ayuda
- 22. ¿Cómo se debería cerrar un subproceso en Java?
- 23. jQuery mobile- ¿Para cada evento de toque en vivo debería haber un evento de clic equivalente?
- 24. ¿Por qué debería usar un punto y coma después de cada función en javascript?
- 25. ConfigurationManager.AppSettings ["SettingName"] vs Properties.Settings.Default.SettingName ¿cuándo debería usar cada uno?
- 26. ¿Debería cada `ftplugin/name.vim` necesitar definir` b: undo_ftplugin`?
- 27. ¿Cómo se hace un cuadro de lista horizontal en .NET
- 28. ¿Cómo reconstruir/reinstalar dependencias de un módulo de CPAN actualizado?
- 29. Cambiar el valor del cuadro de texto cuando se selecciona un elemento en el cuadro desplegable
- 30. Entity Framework Insertar datos iniciales al reconstruir
Si la escena cambia con cada fotograma, entonces debe actualizar el árbol. No siempre es necesario "rehacer" todo el árbol. Mi propia implementación puede actualizarse según sea necesario cuando los objetos se mueven.El tiempo que puede hacer eso o no depende de cómo lo implemente. – phkahler
rehacer == actualización; Los considero sinónimos. Pero su punto es correcto: es casi como si necesitaras una bandera sucia para marcar las piezas que cambiaron. – duffymo