Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 缩放、平移和旋转是如何工作的?_Opengl_Rotation_Zooming_Viewport_Pan - Fatal编程技术网

Opengl 缩放、平移和旋转是如何工作的?

Opengl 缩放、平移和旋转是如何工作的?,opengl,rotation,zooming,viewport,pan,Opengl,Rotation,Zooming,Viewport,Pan,我正试图用OpenGL绘制我的校园的原始地图 有人能给我解释一下平移、缩放和旋转通常是如何实现的吗 例如,通过平移和缩放,这是否就是我调整视口的简单方法?所以我绘制并绘制了构成地图的所有线条,然后当用户单击并拖动时,它会调整我的视口 对于平移,它是否会移动我的视口的x/y值;对于缩放,它是否会增加/减少我的视口一部分?轮换呢 对于旋转,是否必须对表示校园地图的每条多段线进行仿射变换?在一张像样大小的地图上进行飞行不是很昂贵吗 或者,视口是否保持不变,平移/缩放/旋转是否以其他方式完成 例如,如

我正试图用OpenGL绘制我的校园的原始地图

有人能给我解释一下平移、缩放和旋转通常是如何实现的吗

例如,通过平移和缩放,这是否就是我调整视口的简单方法?所以我绘制并绘制了构成地图的所有线条,然后当用户单击并拖动时,它会调整我的视口

对于平移,它是否会移动我的视口的x/y值;对于缩放,它是否会增加/减少我的视口一部分?轮换呢

对于旋转,是否必须对表示校园地图的每条多段线进行仿射变换?在一张像样大小的地图上进行飞行不是很昂贵吗

或者,视口是否保持不变,平移/缩放/旋转是否以其他方式完成


例如,如果你转到这里,你会看到他通过修改视口,准确地描述了我上面描述的平移和缩放


这不对吗

通常,只要在opengl中引用3d空间中的任何点,就会应用三个步骤

给定一个局部点

  • 局部->世界变换
  • 世界->相机变换
  • 摄影机->屏幕变换(通常是投影。取决于您使用的是透视还是正交)
这些变换中的每一个都将获取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 )