CORREGIDO al establecer cerca del plano de recorte en 1, en lugar de en 0 (no estoy seguro de por qué fue así para empezar). Consulte la pregunta sobre el código de esqueleto y la respuesta de Adrián sobre cómo y por qué funciona.Proyectar una textura en OpenGL
Tengo algunas posiciones de cámara diferentes, y mi escena consiste en un solo quad.
El quad es tal que se proyecta exactamente en la ventana/ventana en el primer fotograma. Quiero proyectar una textura desde la posición de esta cámara en el patio. La textura también cubre la ventana gráfica exactamente.
Lo primero que hice fue
// GL_QUADS...
glTexCoord2f(/*one corner of s,t space*/);
glVertex3f(/* appropriate vertex */);;
y terminó con algo como (foto no la mía)
Y entonces me di cuenta de que sí, por supuesto, tiene que ser un proyectiva transformación. De acuerdo con these notes:
- A modelview transform para orientar la proyección en la escena.
- Transformación proyectiva (perspectiva u ortogonal).
- Una escala y un sesgo para asignar el plano de recorte cercano a las coordenadas de textura.
Ahora que funciona, he aquí una aplicación aproximada del código:
// in init code
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
double ratio = width/height;
// set up FROM modelview matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(pcam._fov/ratio, ratio, 1, far_z);
gluLookAt(/* FROM camera's parameters */);
glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); //S, T, R and Q
GLfloat Splane[] = {1.f, 0.f, 0.f, 0.f}; //S, T, R and Q, diagonal
glTexGenfv(GL_S,GL_EYE_PLANE,Splane); //S, T, R and Q
// -- load and bind texture --
glEnable(GL_TEXTURE_GEN_S); //S, T, R and Q
// scale and bias
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.5,0.5,0.0);
glScalef(0.5,0.5,1);
gluPerspective(cam._fov/ratio, ratio, 1, far_z);
gluLookAt(/* TO camera's parameters */);
glBegin(GL_QUADS);
glVertex3f(/* for each vertex */);
glEnd();
glDisable(GL_TEXTURE_GEN_S); //S, T, R and Q
Creo que puede confundir sus cámaras TO y FROM. ¿FROM/pcam es el proyector? GL_TEXTURE debe contener las transformaciones para el proyector en lugar de la cámara de visualización. Sin embargo, no sé si eso resolvería tu problema. –
Sí, es el proyector. Estoy seguro de que estoy proporcionando los detalles correctamente. Incluso si cambio las llamadas de perspectiva/lookat para que ambas utilicen los mismos detalles de la cámara, se ve mal ... – CakeMaster
¿Ambas cámaras comparten los mismos parámetros * exactos? Orientación, posición y vista del tronco: en el momento en que surge el problema ? ¿Por qué está configurando la * vista * de acuerdo con el proyector y las coordenadas de la textura de acuerdo con la cámara de visualización? De lo contrario, las transformaciones y los coeficientes del espacio visual se verán igual que en las notas que ha citado, por lo que en este punto no estoy seguro de qué podría estar pasando. –