我试图从NEHEs教程中了解lesson 9,这是关于在3d空间中移动位图的。OpenGL:了解转换
这里最有趣的事情是通过3d空间将2D位图纹理移动到简单的四边形上,并始终保持其面向屏幕(查看器)。因此,位图看起来像3d,但无论3D空间中的哪个位置,它都始终面向观看者。
在第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,这到底是怎么转动?再次是坐标系,观察者本身?
在一个真实的世界。我会某处放置星在三维空间中,然后在我的世界本源世界空间中旋转,然后做的明星再次移动到原点,并开始在边缘移动,那我就做了一个旋转明星本身就是面向观众的。我想这是在这里完成的。但是,我如何首先围绕世界起源旋转,然后绕着这个明星本身旋转呢?对我来说,看起来像opengl是在世界坐标系统和目标坐标系统之间切换的,它并不像你看到的那样真正发生。
我不需要添加代码的其余部分,因为它非常标准。简单的GL初始化为3D图纸,旋转的东西,然后使用混合使用星形纹理简单地绘制QUADS。而已。
有人能解释IM误会的是什么?
在OpenGL中,约定是旋转原点处的对象,然后将其转换为需要去的地方。这基本上模拟了“局部坐标”旋转。 请记住,这一切都发生在一个堆栈上,所以顺序很重要!此代码将围绕对象的局部轴执行两次旋转,然后将其翻译出来,然后再做两次旋转和平移(有效地转换世界坐标)。 – fjlksahfob 2011-03-04 22:44:19