缩放,平移和旋转工作如何?

Kin*_*tor 6 opengl zoom rotation viewport pan

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

任何人都可以向我解释通常如何实现平移,缩放和旋转?

例如,通过平移和缩放,我只是调整视口吗?所以我绘制并绘制构成我的地图的所有线条,然后当用户点击并拖动时,它会调整我的视口?

对于平移,它是否会移动我的视口的x/y值,而对于缩放是否会增加/减少我的视口一些量?轮换怎么样?

为了轮换,我是否必须为代表我校园地图的每条折线进行仿射变换?在尺寸合适的地图上飞行,这不是很昂贵吗?

或者,视口是否保持不变并且平移/缩放/旋转是否在其他方面完成?


例如,如果您转到此链接您将看到他通过修改视口来描述平移和缩放我上面的具体方式.

这不正确吗?

has*_*sen 7

它们是通过在绘制场景之前应用一系列glTranslate,glRotate命令(代表摄像机位置和方向)来实现的.(从技术上讲,你正在旋转整个场景!)

有像gluLookAt这样的实用函数,它可以抽象出一些关于此的细节.

为简化事物,假设您有两个向量代表您的相机:位置和方向.

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 );
Run Code Online (Sandbox Code Playgroud)

然后开始绘制对象

您可以通过稍微向右或向左更改位置来让用户跨越.旋转有点复杂,因为你必须旋转方向向量.假设你正在旋转的是相机,而不是场景中的某些物体.

一个问题是,如果你只有一个方向向量"向前",你如何移动它?左右在哪里?

在这种情况下我的方法是采用"方向"和(0,1,0)的交叉乘积.

现在,您可以使用以下方法将相机向左和向右移动:

position = position + right * amount; //amount < 0 moves to the left
Run Code Online (Sandbox Code Playgroud)

您可以使用"方向向量"向前移动,但IMO最好将移动限制在水平平面上,因此获取前向向量的方式与获得正确向量的方式相同:

forward = cross( up, right )
Run Code Online (Sandbox Code Playgroud)

说实话,这有点像一种hackish方法.

正确的方法是使用更"复杂"的数据结构来表示相机的"方向",而不仅仅是前向方向.但是,既然你刚刚开始,那么一次采取一步是件好事.

  • 让我补充一点,"视口"(通过glViewport设置)不会进入这个过程.视口决定了你要渲染的窗口区域(实际上这不是真的,但现在就这样想),并且通常会跨越整个窗口. (2认同)

oku*_*ane 5

所有这些“动作”都可以使用模型视图矩阵变换函数来实现。您应该阅读有关 glTranslatef(平移)、glScalef(缩放)、glRotatef(旋转)的内容。您还应该需要阅读一些有关 OpenGL 的基本教程,您可能会发现此链接很有用。