我正在尝试创建一个平截头体投影,以便可以正确查看3D对象并在3D空间中导航。我知道会在0,0,0处创建一个圆锥形的形状,您可以指定它的方向,但是有一些我不明白的地方:
nearClipPlane
和farClipPlane
的工作原理是什么?为什么锥体应该更远?
如何控制相机的位置和指向?
我已经看到人们仅使用 1s 和 -1s 创建平截头体,这是正确的方法吗?
我的代码:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(windowWidth / 2, windowWidth / 2, windowHeight / 2, windowHeight / 2, 0, -50);
glMatrixMode(GL_MODELVIEW);
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//draw
glfwSwapBuffers(window);
glfwPollEvents();
}
答案 0 :(得分:3)
首先,我建议使用新的programmable pipeline而不是旧的固定功能管道,因为已经弃用了十多年。首先,新的管道看起来非常困难,但是当您了解其背后的概念时,它比旧管道要简单得多。
nearClipPlane和farClipPlane到底能做什么?
位于近裁剪平面之前或远裁剪平面后面的对象将不会被渲染。
您不应将负值传递给glFrustum()
的近平面和远平面,常见的值是近平面0.1和远平面距离100-1000。
如何控制相机的位置和指向?
在OpenGL中,您不会更改相机的位置,但会沿相反的方向变换整个场景(modelview-matrix)。例如,如果您想将相机的位置设置为10、0、5,并将相机绕y轴旋转45度,则必须使用
glMatrixMode(GL_MODELVIEW);
/*
If you wouldn't generate a new identity matrix every frame, you would **add** the rotation/translation to the previous one, which obviously isn't what you want
*/
glLoadIdentity();
Vector3f cameraPosititon = new Vector3f(10, 0, 5);
/*
rotate selected matrix about 45 degrees around y
With the 1 as third argument you select that you want to rotate over the y-axis.
If you would pass 1 as 2nd or 4th argument, you would rotate over the x or the z axis.*/
glRotatef(45, 0, 1, 0);
//translate selected matrix about x, y, z
glTranslatef(-1 * cameraPosition.x, -1 * cameraPosition.y, -1 * cameraPosition.z);
我已经通过了将相机的位置乘以-1的位置,因为您必须沿相反的方向变换整个场景才能获得看起来像相机在四处移动的效果。