- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试通过使用 Visual C++ 创建某种 3D 建模器应用程序来学习 OpenGL。屏幕将分为三个窗口:透视、正面和顶部(等距)。而且我几乎放弃尝试实现顶 View 。这是我当前的顶 View 代码:
glOrtho(-1,1,-1,1,1,3.5f);
gluLookAt(
0,2,0,//eye
0,0,0,//center
0,0,-1);//up
但是如果我把物体移到远处的Z,它肯定会消失。如何让顶 View 能够看到场景中的所有对象???
如何计算 glOrtho 和 glLookAt 所需的参数?
最佳答案
您不应使用 gluLookAt(请注意“glu”中的“u”,gluLookAt 不是 OpenGL 的一部分),而应直接设置模型 View 矩阵。首先,您必须定义怎么了向上、远处和侧面。大多数使用 OpenGL 的人更喜欢右手坐标系 (RHCS)。第一个碱基是 X,第二个是 Y,第三个是 Z。在 RHCS 中,X 位于侧面(向右),Y 位于远方,Z 位于上方。 OpenGL 的默认投影是,就好像相机在负方向上向下看 Z 轴,即向下看。
所以我们可以说矩阵
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
低着头。望向远方,你必须偏航。 X保持不变,但交换了Y和Z。对应的矩阵是
1 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
从侧面看,全局 Y 映射到 View X,全局 X 映射到 Z,全局 Z 映射到 Y,结果是
0 1 0 0
0 0 1 0
1 0 0 0
0 0 0 1
现在您可能想要平移和缩放该 View 。您可以使用 glScale 和 glTranslate 或直接在矩阵中执行此操作。
s 0 0 pan.x
0 s 0 pan.y
0 0 s pan.z
0 0 0 1
s 0 0 pan.x
0 0 s pan.y
0 s 0 pan.z
0 0 0 1
0 s 0 pan.x
0 0 s pan.y
s 0 0 pan.z
0 0 0 1
现在,在 Z 方向平移在正交投影中意义不大。所以你可以让 pan.z 为零。
现在让我们解决您的深度裁剪问题。正交投影的一个很好的特性是,深度裁剪范围将线性映射到深度缓冲区中,而在透视投影中它遵循 1/x 定律。远近距离的混合符号也是完全允许的,并且也没有限制 |near| < |远|。因此,对于您的每个 View ,您所要做的就是确定所有对象的变换顶点的最小和最大位置,并使用它们在每个 View 的投影中设置适当的裁剪值。一个很好的近似值,这样您就不必遍历每个顶点使用对象边界球体和位置(将边界球体半径添加/减去它的位置)来获得最小/最大范围。
关于c++ - glOrtho 制作顶 View 的正确参数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818657/
我正在尝试从 opengles 文档中实现我自己的 glOtho 函数 http://www.khronos.org/opengles/documentation/opengles1_0/html/g
我最近开始使用 LWJGL,注意到 glOrtho 方法采用参数 left、right、bottom、top,但无法弄清楚这些参数对应的是什么。 当我注意到这一点时,我很困惑 glOrtho(1, 1
我正在尝试向我的游戏添加一些基本的 HUD,但是当我尝试更改视角时,我可以看到文本(我之前提到过 HUD),但是在黑屏上。问题出在哪里? gl.glMatrixMode(GL_PROJ
我在使用 GLM 库的 GLMDraw() 函数绘制 Google SketchUp 3D 图像的程序中使用 glOrtho 时遇到问题。我只想在投影模式下查看某些 z 值的图像,而 glOrtho(
/* OpenGL animation code goes here */ glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear
目前我正在使用 glOrtho 来缩放和平移我正在渲染的 2D 图形。 我已将视口(viewport)设置为标准宽度和高度。然后我设置 glOrtho 以便我的平截头体使屏幕坐标与世界坐标匹配。 gl
我正在尝试使用本教程学习 LWJGL:http://www.java-gaming.org/topics/lwjgl-tutorial-series-a-simple-moving-rectangle
我正在尝试使用 LWJGL 将 ClickTeam Fusion 游戏移植到 Java。我决定简单地使用像素测量,因为这个游戏中的所有内容都是使用 PNG 文件完成的,甚至是动画(是的,确实如此)。我
鉴于我做了这样的事情: void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLd
我创建了一个 OpenGL 应用程序,其中使用 glOrtho() 定义了一个查看体积。然后我使用 gluLookAt() 来转换所有点。问题是 - 一旦我这样做,所有点都会从裁剪平面中掉出来,因为它
我正在纹理上绘制,然后使用 GL_QUADS 将此纹理渲染到屏幕上。在屏幕上绘制纹理没有问题,但是在绘制纹理时,唯一有效果的操作是 glClear(GL_COLOR_BUFFER_BIT | GL_D
我是 OpenGl 的初学者,我在设置 glOrtho 相机以匹配窗口大小方面遇到了一些困难,以便我可以使用窗口的坐标绘制一条线。例如,如果我想从坐标 0,10 (x,y) 到 600,10 画一条线
我正在 OpenGL 中创建一个应用程序,我在其中使用 glOrtho(),原点位于左上角: glOrtho(0.0, width, height, 0.0, 0.0, 1.0); 直到我尝试渲染轮廓
我在使用 glOrtho 移动相机时遇到问题。我在中心有一个小四边形,我想尝试使用 glOrtho 移动相机,但它似乎不起作用。四边形根本不动,所以我猜相机也没有移动。也许我想念 glOrtho 的工
我需要在与 XOZ 平面平行(垂直于 OY)的平面上进行 opengl 投影。 你能解释一下我应该使用 glOrtho 进行投影的哪些参数吗? 谢谢, 最佳答案 你的问题的措辞对我来说不是很清楚,但如
我正在使用 OpenGL 创建 2D 游戏。每次我移动对象时,我都必须调用 glLoadIdentity,否则所有对象都会被移动,但是 glLoadIdentity 也会重置 glOrtho 调用,所
我在 (0,0) 处抽了一辆汽车,并设置了一些障碍,但现在我主要关心的是从 glPerspective 切换到 glOrtho,反之亦然。当我从透视切换到正射时,我得到的只是黑屏。 void myin
所以我有一个 3D 对象,我用以下光线绘制: GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 0.9}; /* White light. */ GLflo
在 OpenGL 中我可以这样做: glOrtho(-10, 10, -10, 10, -1, 1) 建立一个坐标系,其中x的范围是-10到10,y的范围是-10到10。 有没有办法在 WPF 中更改
我不知道我的函数是否做错了什么(可能是 glOrtho 的参数错误),所以结果就是错误的,或者是否一切正常。 特别是我有这种情况: 我希望绿色矩形及其所有内部内容占据窗口的所有空间,而不仅仅是窗口的一
我是一名优秀的程序员,十分优秀!