我试图理解NEHEs 教程中的第 9 课,这是关于在 3d 空间中移动位图的。
这里最有趣的是通过 3d 空间在一个简单的四边形上移动 2d 位图纹理,并使其始终面向屏幕(查看器)。所以位图看起来是 3d 的,但无论它在 3d 空间中的哪个位置,它始终是 2d 面向观察者的。
在第 9 课中,生成了一个绕圈移动的星星列表,看起来非常好。为了避免从侧面看到星星,编码人员正在做一些棘手的编码,以使星星始终面向观察者。
代码如下:(在循环中为每个星调用以下代码)
glLoadIdentity();
glTranslatef(0.0f,0.0f,zoom);
glRotatef(tilt,1.0f,0.0f,0.0f);
glRotatef(star[loop].angle,0.0f,1.0f,0.0f);
glTranslatef(star[loop].dist,0.0f,0.0f);
glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);
glRotatef(-tilt,1.0f,0.0f,0.0f);
在上面的线条之后,开始绘制星星。如果您检查最后两行,您会看到第 3 行和第 4 行的转换刚刚被取消(如撤消)。最后的这两行让我们有可能让星星一直面向观众。但我不知道为什么这是有效的。
我认为这来自于我对 OpenGL 如何真正进行转换的误解。对我来说,最后两行就像撤销之前所做的一样,这对我来说没有意义。但它的工作。
因此,当我调用 glTranslatef 时,我知道视图的当前矩阵乘以 glTranslatef 提供的平移值。换句话说,“glTranslatef(0.0f,0.0f,zoom);” 如果缩放为负数,则会将我要绘制星星的位置移动到场景中。好的。
但究竟是什么被移到了这里?观看者是“离开”了还是有某种对象坐标系通过 glTranslatef 移动到场景中?这里发生了什么事?
然后glRotatef,这里旋转的是什么?又是一个坐标系,观众本身?
在现实世界中。我会将星星放置在 3d 空间中的某个位置,然后在围绕我的世界原点的世界空间中旋转它,然后在星星移动到原点并再次从边缘开始时进行移动,然后我会为明星本身,所以它面向观众。我想这是在这里完成的。但是我如何首先围绕世界原点旋转,然后围绕恒星本身旋转?对我来说,opengl 似乎正在世界坐标系统和对象坐标系统之间切换,这并没有像你看到的那样真正发生。
我不需要添加其余的代码,因为它非常标准。简单的 GL 初始化 3d 绘图,旋转的东西,然后使用混合使用星形纹理进行简单的 QUADS 绘图。就是这样。
有人可以解释一下我在这里误解了什么吗?