【发布时间】:2010-09-03 01:03:01
【问题描述】:
通过将剪裁平面附近设置为 1 而不是 0 来修复(不知道为什么会这样开始)。请参阅有关骨架代码的问题,以及 Adrian 的回答以了解其工作原理和原因。
我有几个不同的相机位置,我的场景由一个四边形组成。
四边形是这样的,它在第一帧中准确地投影到视口/窗口上。我想将这个相机位置的纹理投影到四边形上。纹理也完全覆盖了视口。
我做的第一件事是
// GL_QUADS...
glTexCoord2f( /*one corner of s,t space*/);
glVertex3f(/* appropriate vertex */);;
最后得到了类似(图片不是我的)
然后我意识到是的,当然,它需要是一个投影转换。根据these notes:
- 用于在场景中定向投影的模型视图变换。
- 投影变换(透视或正交)。
- 将近剪裁平面映射到纹理坐标的比例和偏差。
现在它可以工作了,下面是代码的粗略实现:
// 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
【问题讨论】:
-
我认为您的 TO 和 FROM 相机可能混淆了。 FROM/pcam 是投影机吗? GL_TEXTURE 应该包含投影仪而不是视图相机的变换。不过,我不知道这是否能解决您的问题。
-
是的,它是投影仪。我确定我正确地提供了详细信息。即使我将透视/观察调用更改为使用相同的相机细节,它看起来也是错误的......
-
在出现问题时,两个相机是否共享精确相同的参数——方向、位置和视锥体?为什么要根据投影仪设置 view 并根据视图相机设置纹理坐标?否则,您的变换和眼睛空间系数看起来与您引用的注释相同,所以在这一点上,我对可能发生的事情感到困惑。
-
是的,为了测试,我正试图将其投影回完全相同的相机中。一旦这个工作,我可以尝试其他相机。我也被难住了:(
-
根据 cmets 的说法,GL_EYE_LINEAR 对所有 S、T、R 和 Q 都启用,对吗?您是否还将 R 平面设置为 (0.0, 0.0, 1.0, 0.0) 并将 Q 平面设置为 (0.0, 0.0, 0.0, 1.0)?另外,我仍然不明白您为什么要使用投影仪(“pcam”)对象设置视图,但是既然您说它与“cam”完全相同,那么此时这并不重要。