OpenGL透视投影中的相机在哪里?
Where is the camera in OpenGL perspective projection?
我在使用 openGL 时遇到了一个奇怪的问题。
定义我的截锥体的代码:
glFrustum(0.0, 50.0, 0.0, 50.0, 5.0, 35.0);
生成多边形和曲线的代码
glBegin(GL_POLYGON); // a rectangle
glVertex3f(20.0, 20.0, -6.0);
glVertex3f(20.0, 20.0, -10.0);
glVertex3f(20.0, 60.0, -10.0); // point A
glVertex3f(20.0, 60.0, -6.0); // point B
glEnd();
glBegin(GL_LINE_STRIP);
for (float i = -PI; i < -PI/3; i += 2 * PI / numSides) {
glVertex3f(X+14*i, Y + sin(i)*R, -6.0);
}
正如你所看到的,即使 B 点被定义为更靠近投影屏幕,它在 Oxz 平面上的投影比 A 点短。这几乎就像两点以某种方式交换了位置或相机位置在他们身后,而不是 (0, 0, 0)。谁可以给我解释一下这个?
你的假设是错误的。点 A 位于 (20.0, 60.0, -6.0) 点 B 位于 (20.0, 60.0, -10.0).
使用 glFrustum(-60.0, 60.0, -60.0, 60.0, 5.0, 35.0);
以获得更好的场景视图,因为平截头体的原点位于 window 的中间,并将四边形扩展为立方体,通过添加正面和底部,使场景更具空间感:
glFrustum(-60.0, 60.0, -60.0, 60.0, 5.0, 35.0);
glLineWidth( 3.0f );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glColor4f( 1.0f, 0.0f, 0.0f, 1.0f );
glBegin(GL_POLYGON);
glVertex3f(20.0, 20.0, -6.0);
glVertex3f(60.0, 20.0, -6.0);
glVertex3f(60.0, 60.0, -6.0);
glVertex3f(20.0, 60.0, -6.0);
glEnd();
glBegin(GL_POLYGON);
glVertex3f(20.0, 20.0, -6.0);
glVertex3f(60.0, 20.0, -6.0);
glVertex3f(60.0, 20.0, -10.0);
glVertex3f(20.0, 20.0, -10.0);
glEnd();
glColor4f( 0.0f, 0.0f, 0.0f, 1.0f );
glBegin(GL_POLYGON);
glVertex3f(20.0, 20.0, -6.0);
glVertex3f(20.0, 20.0, -10.0);
glVertex3f(20.0, 60.0, -10.0);
glVertex3f(20.0, 60.0, -6.0);
glEnd();
const float PI = 3.1415917f;
static float X = 20.0f + PI *14;
static float Y = 60.0f;
static float R = 20.0f;
int numSides = 30;
glBegin(GL_LINE_STRIP);
for (float i = -PI; i < -PI/3; i += 2 * PI / numSides) {
glVertex3f(X+14*i, Y + sin(i)*R, -6.0);
}
glEnd();
查看图片,其中洋红色十字标记了视角:
我在使用 openGL 时遇到了一个奇怪的问题。
定义我的截锥体的代码:
glFrustum(0.0, 50.0, 0.0, 50.0, 5.0, 35.0);
生成多边形和曲线的代码
glBegin(GL_POLYGON); // a rectangle
glVertex3f(20.0, 20.0, -6.0);
glVertex3f(20.0, 20.0, -10.0);
glVertex3f(20.0, 60.0, -10.0); // point A
glVertex3f(20.0, 60.0, -6.0); // point B
glEnd();
glBegin(GL_LINE_STRIP);
for (float i = -PI; i < -PI/3; i += 2 * PI / numSides) {
glVertex3f(X+14*i, Y + sin(i)*R, -6.0);
}
正如你所看到的,即使 B 点被定义为更靠近投影屏幕,它在 Oxz 平面上的投影比 A 点短。这几乎就像两点以某种方式交换了位置或相机位置在他们身后,而不是 (0, 0, 0)。谁可以给我解释一下这个?
你的假设是错误的。点 A 位于 (20.0, 60.0, -6.0) 点 B 位于 (20.0, 60.0, -10.0).
使用 glFrustum(-60.0, 60.0, -60.0, 60.0, 5.0, 35.0);
以获得更好的场景视图,因为平截头体的原点位于 window 的中间,并将四边形扩展为立方体,通过添加正面和底部,使场景更具空间感:
glFrustum(-60.0, 60.0, -60.0, 60.0, 5.0, 35.0);
glLineWidth( 3.0f );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glColor4f( 1.0f, 0.0f, 0.0f, 1.0f );
glBegin(GL_POLYGON);
glVertex3f(20.0, 20.0, -6.0);
glVertex3f(60.0, 20.0, -6.0);
glVertex3f(60.0, 60.0, -6.0);
glVertex3f(20.0, 60.0, -6.0);
glEnd();
glBegin(GL_POLYGON);
glVertex3f(20.0, 20.0, -6.0);
glVertex3f(60.0, 20.0, -6.0);
glVertex3f(60.0, 20.0, -10.0);
glVertex3f(20.0, 20.0, -10.0);
glEnd();
glColor4f( 0.0f, 0.0f, 0.0f, 1.0f );
glBegin(GL_POLYGON);
glVertex3f(20.0, 20.0, -6.0);
glVertex3f(20.0, 20.0, -10.0);
glVertex3f(20.0, 60.0, -10.0);
glVertex3f(20.0, 60.0, -6.0);
glEnd();
const float PI = 3.1415917f;
static float X = 20.0f + PI *14;
static float Y = 60.0f;
static float R = 20.0f;
int numSides = 30;
glBegin(GL_LINE_STRIP);
for (float i = -PI; i < -PI/3; i += 2 * PI / numSides) {
glVertex3f(X+14*i, Y + sin(i)*R, -6.0);
}
glEnd();
查看图片,其中洋红色十字标记了视角: