Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Color picking

Iniciado por KneDa, 21 de Junio de 2012, 05:42:52 PM

« anterior - próximo »

KneDa

Saludos chicos, actualmente he implementado la técnica de color-picking en mi engine y la verdad funciona bastante bien. Ahora bien, el siguiente paso es interactuar con los múltiples objetos seleccionados con el ratón y hacer las típicas transformaciones que todo programa de modelado3d consigue hacer.

Para empezar, estoy interesado en el movimiento de dichas entidades en el plano XY pero no he conseguido comprender el algoritmo. He visto esta página que en teoría lo explica muy bien... pero no me acabo de enterar muy bien. http://www.codeproject.com/Articles/35139/Interactive-Techniques-in-Three-dimensional-Scenes

Algún alma caritativa que me pudiese explicar el algoritmo que consigue determinar el vector de desplazamiento de los objetos seleccionados? (El engine soporta varios tipos de cámaras, por lo que en principio la posición y orientación puede ser cualquiera).

Gracias por adelantado.

Manu343726

Lo que tienes que hacer es usar un plano como referencia para sacar la traslación del objeto.

Es decir, creas el plano (El que más te convenga, suelen dar problemas los que son paralelos a la pantalla), y lo que haces es calcular la intersección entre la recta de selección y el plano al principio y al final del movimiento. El vector que estás buscando es el que une ambas intersecciones.

La recta de selección es la recta que une la posición de la cámara con el pixel que señala el ratón en pantalla. No se te olvide pasarla a coordenadas de mundo.

KneDa

Finalmente he conseguido implementar el algoritmo, una vez comprendido el tema de crear los rayos y el tema de intersecciones no tiene mayor misterio.

Además, puedo decir que está tirando bastante rápido, el color picking es ideal cuando no se necesita control a nivel de primitiva, solo a nivel de partes o id's de modelos. Lo único que no me acaba de convencer es el tener que hacer dos pasadas de la escena para el picking, una para los id's y otra para las intersecciones del modelo usando el depth.

Cuando sea posible leer directamente el depth buffer en webgl y utilizar MRT esto empezará a molar mucho más  :D

Manu343726

al final que plano usaste? el suelo (zox) ? estube pensando, si usas el plano de la pantalla puede ser muy versatil, dependiendo de como lo quieres mover pones la camara dde una manera o de otra

KneDa

Pues al final dependerá del tipo de objeto y las restricciones que tenga el mismo, me explico, si por ejemplo quieres mover un objeto que está situado en una pared, dicho objeto se podrá mover en los límites de la pared. Ahora bien, si por ejemplo tienes un objeto en una mesa, el objeto se moverá en dicha mesa, pero si el objeto se sale de los límites de dicho objeto se desplazará a un objeto de nivel inferior y se restringirá al plano del objeto inferior :)

Manu343726

mmmm me gusta, muy bien pensado, así vas "arrastrando" el objeto por encima de las escena. Me lo guardaré para futuras implementaciones XD

KneDa

#6
Bueno, la técnica es tan simple como que tu a cada objeto le asignas un nivel y una altura, si dicho objeto posiciona objetos encima de su superficie. Así, para determinar el plano de posicionamiento simplemente tienes que considerar el AABB del objeto, que junto con la altura y el id te servirá para obtener el plano de referencia. La única limitación de tan simple técnica es que te encontrarás con situaciones tales como esta, donde el objeto descansará sobre el plano de referencia correcto, pero dicha superficie esté vacía.

.

No obstante, la técnica es super rápida e ideal para editores 3d que manejen objetos con superficies planas.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.