使用OpenGL我试图绘制我校园的原始地图。
有人可以向我解释通常如何实现平移,缩放和旋转吗?
例如,通过平移和缩放,我只是调整视口吗?所以我绘制并绘制构成我的地图的所有线条,然后当用户点击并拖动时,它会调整我的视口?
对于平移,它是否会移动我的视口的x / y值,而对于缩放是否会增加/减少我的视口一些量?轮换怎么办?
为了轮换,我是否必须为代表校园地图的每条折线进行仿射变换?在一块体面的地图上做这件事会不会很昂贵?
或者,视口是否保持不变并且平移/缩放/旋转在其他方面完成?
例如,如果你转到这个link,你会看到他通过修改视口来描述平移和缩放我上面的方式。
这不正确吗?
答案 0 :(得分: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 );
然后开始绘制对象
您可以通过稍微向右或向左更改位置来让用户跨越。旋转有点复杂,因为你必须旋转方向向量。假设您正在旋转的是相机,而不是场景中的某个对象。
一个问题是,如果你只有一个方向向量“向前”,你如何移动它?左右在哪里?
在这种情况下我的方法是采用“方向”和(0,1,0)的交叉乘积。
现在您可以使用以下内容向左和向右移动相机:
position = position + right * amount; //amount < 0 moves to the left
你可以使用“方向向量”向前移动,但是IMO最好将移动限制在水平平面上,所以得到前向向量的方式与我们得到正确向量的方式相同:
forward = cross( up, right )
老实说,这有点像一种黑客行为。
正确的方法是使用更“复杂”的数据结构来表示相机的“方向”,而不仅仅是前向方向。但是,既然你刚刚开始,那么一次采取一步是件好事。
答案 1 :(得分:4)
使用模型 - 视图矩阵变换函数可以实现所有这些“动作”。你应该阅读glTranslatef(平移),glScalef(缩放),glRotatef(旋转)。您还需要阅读一些关于OpenGL的基础教程,您可能会发现this link很有用。
答案 2 :(得分:1)
通常,只要您在opengl中引用3d空间中的任何点,就会应用三个步骤。
给出一个本地点
这些变换中的每一个都取你的3d点,并乘以矩阵。
当您旋转相机时,它通常会改变世界 - &gt;通过旋转/平移/缩放仿射变换乘以变换矩阵进行相机变换。由于每个帧都会重新渲染所有点,因此新矩阵将应用于您的点,并且它会给出旋转的外观。