Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: KneDa en 21 de Junio de 2012, 05:42:52 PM

Título: Color picking
Publicado por: KneDa en 21 de Junio de 2012, 05:42:52 PM
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.
Título: Re: Color picking
Publicado por: Manu343726 en 24 de Junio de 2012, 12:22:09 PM
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.
Título: Re: Color picking
Publicado por: KneDa en 26 de Junio de 2012, 04:34:43 PM
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
Título: Re: Re: Color picking
Publicado por: Manu343726 en 03 de Julio de 2012, 09:21:08 AM
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
Título: Re: Color picking
Publicado por: KneDa en 03 de Julio de 2012, 10:33:39 AM
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 :)
Título: Re: Color picking
Publicado por: Manu343726 en 08 de Julio de 2012, 01:33:54 PM
mmmm me gusta, muy bien pensado, así vas "arrastrando" el objeto por encima de las escena. Me lo guardaré para futuras implementaciones XD
Título: Re: Color picking
Publicado por: KneDa en 08 de Julio de 2012, 07:26:05 PM
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.

(http://i45.tinypic.com/e0fzir.jpg) .

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