opengl - 缩放、平移和旋转如何工作?

标签 opengl rotation zooming viewport pan

使用 OpenGL 我正在尝试绘制我校园的原始 map 。

谁能向我解释一下平移、缩放和旋转通常是如何实现的?

例如,通过平移和缩放,这仅仅是我调整我的视口(viewport)吗?所以我绘制并绘制了构成我的 map 的所有线条,然后当用户单击并拖动它时,它会调整我的视口(viewport)吗?

对于平移,它会改变我的视口(viewport)的 x/y 值吗?对于缩放,它是否会增加/减少我的视口(viewport)?轮换怎么办?

对于旋转,我是否必须对代表我的校园 map 的每条折线进行仿射变换?在一张体面大小的 map 上即时执行此操作会不会很昂贵?

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

例如,如果您转到此 link你会看到他通过修改视口(viewport)来描述我上面的平移和缩放。

这不正确吗?

最佳答案

它们是通过在绘制场景之前应用一系列 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 )

老实说,这在某种程度上是一种骇人听闻的方法。

正确的做法是使用更“复杂”的数据结构来表示相机的“方向”,而不仅仅是向前的方向。但是,由于您才刚刚开始,因此最好一次采取一步。

关于opengl - 缩放、平移和旋转如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/584463/

相关文章:

java - 相机应用程序将图像旋转 90 度

javascript - 如何在 Phaser 游戏中旋转 'player'?

css - 如何在 CSS 中将 hr 行旋转 90 度并在其前面放置文本?

css - 变焦比。在 CSS3 中缩放

c++ - 调用 glBufferData() 时随机 "unhandled exception"

OpenGL 规范规定 `GLint` 必须是 32 位宽,但 gl.xml 天真地将其定义为 `int` 而不是 `int32_t` 。为什么?

android - webview 中的 scale 和 zoom 有什么区别?

android TouchImageView 高度不改变

c++ - 虚拟机中的OpenGL问题

delphi - 使用显卡(DirectX、OpenGL)代替 GDI 或 GR32 函数