Tengo una proyección en perspectiva. Cuando el usuario hace clic en la pantalla, quiero calcular el rayo entre los planos cercano y lejano que se proyecta desde el punto del mouse, para poder hacer un código de intersección de rayos con mi mundo.
Estoy usando mi propia matriz y clases de vectores y rayos y todos funcionan como se esperaba.
Sin embargo, cuando trato de convertir el rayo en coordenadas mundiales, mi distancia siempre termina como 0,0,0 y, por lo tanto, mi rayo va desde el clic del mouse al centro del espacio del objeto, en lugar de a través de él. (Las coordenadas x e y de cerca y de lejos son idénticas, solo difieren en las coordenadas z donde son negativas entre sí)
GLint vp[4];
glGetIntegerv(GL_VIEWPORT,vp);
matrix_t mv, p;
glGetFloatv(GL_MODELVIEW_MATRIX,mv.f);
glGetFloatv(GL_PROJECTION_MATRIX,p.f);
const matrix_t inv = (mv*p).inverse();
const float
unit_x = (2.0f*((float)(x-vp[0])/(vp[2]-vp[0])))-1.0f,
unit_y = 1.0f-(2.0f*((float)(y-vp[1])/(vp[3]-vp[1])));
const vec_t near(vec_t(unit_x,unit_y,-1)*inv);
const vec_t far(vec_t(unit_x,unit_y,1)*inv);
ray = ray_t(near,far-near);
¿Qué me he equivocado? (¿Cómo se desinstala el punto del mouse?)
Respuestas:
Recientemente tuve que resolver esto yo mismo para una aplicación WebGL. He adjuntado el código fuente completo, pero en caso de que no funcione de inmediato, aquí hay algunos consejos de depuración:
Además, para responder a algunos de los comentarios anteriores, casi nunca desea utilizar las API de selección de OpenGL. Eso lo ayuda a elegir elementos existentes, como si estuviera creando un menú, sin embargo, no puede realizar la mayoría de los escenarios del mundo real, como la edición de modelos 3D. Donde necesita agregar geometría como resultado del clic.
Aquí está mi implementación. No hay nada mágico pasando aquí. Solo JavaScript y la biblioteca de cierre de Google.
gluUnProject
Uso
fuente
No veo ningún problema con tu código. Entonces solo tengo algunas sugerencias:
Y tratando de cambiar la multiplacación matricial a
(p*mv).inverse();
. Solo porque glMatrices se transponen nutaraly en la memoria. (este es uno grande tal vez, lo siento)Otro
Raycasting Unprojecting no es solo la forma de obtener rayos del píxel. Este es mi código para raycaster:
Puede obtener cameraRight, Up y Direction desde view matrix (que es principalmente útil en shader) View matrix en opengl
Selección de
color La selección de color es una técnica en la que renderiza cada objeto en el que se puede hacer clic con otro color (sólido) y luego lee el valor del color en el punto en el que se hizo clic. Funcionó como GL_SELECTION en opengl. Pero ahora está en desuso. Pero la selección de color es fácil de codificar como 1 pase de renderizado adicional.
Use el búfer de marco y renderice para texturizar con la misma resolución que la resolución de pantalla, use un sombreador simple que solo devuelve el color en el sombreador de fragmentos. Después de "color pass", lea el valor de una dirección de textura con clickedPoint x e y. Encuentra el objeto con el color que lees. Fácil y bastante rápido.
fuente