Opengl 缩放、平移和旋转是如何工作的?
我正试图用OpenGL绘制我的校园的原始地图 有人能给我解释一下平移、缩放和旋转通常是如何实现的吗 例如,通过平移和缩放,这是否就是我调整视口的简单方法?所以我绘制并绘制了构成地图的所有线条,然后当用户单击并拖动时,它会调整我的视口 对于平移,它是否会移动我的视口的x/y值;对于缩放,它是否会增加/减少我的视口一部分?轮换呢 对于旋转,是否必须对表示校园地图的每条多段线进行仿射变换?在一张像样大小的地图上进行飞行不是很昂贵吗 或者,视口是否保持不变,平移/缩放/旋转是否以其他方式完成Opengl 缩放、平移和旋转是如何工作的?,opengl,rotation,zooming,viewport,pan,Opengl,Rotation,Zooming,Viewport,Pan,我正试图用OpenGL绘制我的校园的原始地图 有人能给我解释一下平移、缩放和旋转通常是如何实现的吗 例如,通过平移和缩放,这是否就是我调整视口的简单方法?所以我绘制并绘制了构成地图的所有线条,然后当用户单击并拖动时,它会调整我的视口 对于平移,它是否会移动我的视口的x/y值;对于缩放,它是否会增加/减少我的视口一部分?轮换呢 对于旋转,是否必须对表示校园地图的每条多段线进行仿射变换?在一张像样大小的地图上进行飞行不是很昂贵吗 或者,视口是否保持不变,平移/缩放/旋转是否以其他方式完成 例如,如
例如,如果你转到这里,你会看到他通过修改视口,准确地描述了我上面描述的平移和缩放
这不对吗 通常,只要在opengl中引用3d空间中的任何点,就会应用三个步骤 给定一个局部点
- 局部->世界变换
- 世界->相机变换
- 摄影机->屏幕变换(通常是投影。取决于您使用的是透视还是正交)
旋转摄影机时,它通常通过将变换矩阵乘以旋转/平移/缩放仿射变换来更改世界->摄影机变换。由于每个帧都会重新渲染所有点,因此新矩阵将应用于点,并呈现旋转的外观。所有这些“动作”都可以使用模型视图矩阵变换函数实现。您应该了解GLTRANSTALEF(平移)、glScalef(缩放)、glRotatef(旋转)。您还需要阅读一些有关OpenGL的基本教程,您可能会发现它们很有用。它们是通过在绘制场景之前应用一系列glTranslate、glRotate命令(表示摄影机位置和方向)实现的。(从技术上讲,您正在旋转整个场景!) 有像gluLookAt这样的实用函数,sorta抽象了一些细节 为了简化事情,假设你有两个矢量代表你的相机:位置和方向 gluLookAt获取位置、目的地和上方向向量 如果实现一个向量类,
destinaion=position+direction
应该为您提供一个目标点
同样,为了使事情变得简单,您可以假设上向量始终为(0,1,0)
然后,在渲染场景中的任何内容之前,加载标识矩阵并调用gluLookAt
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );
然后开始绘制对象
您可以通过稍微向右或向左更改位置来让用户跨越。旋转有点复杂,因为必须旋转方向向量。假设旋转的是摄影机,而不是场景中的某个对象
一个问题是,如果你只有一个方向向量“向前”,你如何移动它?左边和右边在哪里
在这种情况下,我的方法是只取“方向”和(0,1,0)的叉积
现在,您可以使用以下方法左右移动相机:
position = position + right * amount; //amount < 0 moves to the left
老实说,这是一种有点黑客的方法
正确的方法是使用更“复杂”的数据结构来表示相机的“方向”,而不仅仅是前进方向。但是,由于您刚刚开始,最好一步一步地进行操作。让我补充一点,“视口”(通过glViewport设置)在任何时候都不会进入此过程。视口确定将渲染到窗口的哪个区域(这实际上不是真的,但现在可以这样想),并且通常会覆盖整个窗口。
forward = cross( up, right )