void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix();//将原点的坐标压入栈中 glTranslatef( -0.3, 0.0, 0.0);执行完后的坐标? glRotatef( (GLfloat)sh, 0.0, 0.0, 1.0 );执行完后的坐标? glTranslatef(1.0, 0.0, 0.0);执行完后的坐标? glPushMatrix();执行完后的坐标? glScalef(2.0, 0.4, 1.0);执行完后的坐标? glutWireCube(1.0);画正方体时坐标是在哪的?中心又是哪? glPopMatrix();执行完后的坐标? glTranslatef(1.0, 0.0, 0.0); glRotatef( (GLfloat)el, 0.0, 0.0, 1.0 ); glTranslatef(1.0, 0.0, 0.0); glPushMatrix(); glScalef(2.0, 0.4, 1.0); glutWireCube(1.0); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); }
我有更好的答案算法
分享到:url
2012-04-02 21:29StarArchon | 一级 最快回答spa
先前我在调用OpenGL开发图形环境时,坐标变换也曾困扰我好长一阵子,记得当时是在为每一个图形实例配置各自的轨迹球时要求修正轨迹球算法。 言归正传,首先您须知道OpenGL中的矩阵为列主序矩阵,这是您关于OpenGL矩阵变换进行正确理解与运用的大前提(若对此没有概念请先花半小时上网弄明白,这里不赘述)。其次须要注意,对于坐标变换矩阵操做的有两种理解方式,不妨称“顺式”与“反式”(若不明白还请自已上网查阅,这里点到为止),都是正确的,在不一样的时候选择恰当的理解方式能够事半功倍哦!就本例子而言“顺式”理解更为方便 下面分析相关代码: glPushMatrix();将当前的变换矩阵压栈,容许以后经过矩阵弹栈以撤销之间的变换操做(比如系统还原中设置“还原点”) glTranslatef( -0.3, 0.0, 0.0); 这是您问题的重点吧?!先来普及知识: OpenGL中有个绝对坐标系,它以屏幕中心为原点,水平向右为X轴,竖直向上为Y轴,垂直屏幕向外为Z轴。在“顺式”理解下,该坐标系是不动的,而想象初始时你就出在原点位置,眼睛看着Z轴负方向,1.随后命令——glTranslatef( -0.3, 0.0, 0.0);好,这下你沿X负方向走了0.3f,来到(-0.3, 0.0, 0.0)处(注意你并无转头,眼睛仍然看着Z轴负方向) 2.再命令glRotatef( (GLfloat)sh, 0.0, 0.0, 1.0 );对,你以Y轴正方向为转轴将脑壳身子扭转了sh角,但注意你的位置并未改变。 3.又glTranslatef(1.0, 0.0, 0.0);这下你沿X正方向走了1.0f,但重点注意!!——这里的X轴是相对你而言的,不是绝对坐标系中的X轴(所谓“顺式”就体如今这里),即每一步变换都是在以下坐标系中进行的:你眼睛看着的是Z轴负方向,脑壳指向Y轴正方向,右手边为X轴正方向 glPushMatrix();再次压栈 4.glScalef(2.0, 0.4, 1.0);将尺度进行缩放,该步骤无所谓坐标系 glutWireCube(1.0);你在本身的位置放了一个立方体,至于你本身在哪里,应很容易即可算出吧~ glPopMatrix();弹栈,即还原至第4步前的变换状态 相信已解释得够通俗的了,不懂再问吧~
追问code
这段代码是为了作一个机器人手臂的旋转的!但我不知道为何第二个(就是你的编号3)glTranslatef会影响旋转点,当glTranslatef(1.0, 0.0, 0.0)和glutWireCube(1.0)的值相同时,是绕着一个点旋转的,就是第一个glTranslatef后的点,若是他们的值不一样,则旋转的点就不是那个点。。。
回答开发
glTranslatef命令固然会影响旋转点,在上述的理解下,我已说的很清楚了:每次的旋转时考虑的坐标系都是当前状况下——虚拟世界中的“你”所在的位置为原点O,“你”眼睛看着为Z轴负方向,脑壳指向的为Y轴正方向,右手边为X轴正方向。当调用glTranslatef命令时“你”的位置显然改变(平移)了,那么旋转时所考虑的坐标系也就相应平移了,且显然单步的旋转是不会改变“你”在虚拟世界的位置的,仅改变面对的方向。至于“当glTranslatef(1.0, 0.0, 0.0)和……不是那个点。。。”我不理解你在说什么,glutWireCube(1.0)意思即:在“你”所在的位置处绘制一个线框立方体(方向与“你”面对的方向相应),1.0应该是尺寸的参数吧