作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个平截头体投影,以便我可以正确查看 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();
}
最佳答案
首先,我建议使用新的 programmable pipeline而不是旧的固定功能管道,因为它已经被弃用十多年了。首先,新的管道看起来很困难,但是当你理解了它背后的概念时,它比旧的管道简单得多。
What exactly do nearClipPlane and farClipPlane work?
位于近剪裁平面前面或远剪裁平面后面的对象不会被渲染。对于近平面和远平面,您不应将负值传递给 glFrustum()
,常见的近平面距离值为 0.1,远平面距离为 100-1000。
How do I control the position and where the camera points?
在OpenGL中,您不改变相机的位置,而是以相反的方向变换整个场景(模型 View 矩阵)。例如,如果您想将相机的位置设置为 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,因为你必须将整个场景反向变换才能得到相机在移动的效果。
关于java - 如何正确设置截锥体投影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55832013/
我是一名优秀的程序员,十分优秀!