opengl绘制一个机器人手臂的一些问题

glClear(GL_COLOR_BUFFER_BIT);glPushMatrix();//将当前的堆栈中所有的堆栈向下压入一级。其实是相当于记住当前的位置。//记住了全... glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix(); //将当前的堆栈中所有的堆栈向下压入一级。其实是相当于记住当前的位置。
//记住了全局坐标系中的坐标位置。
glTranslatef (-1.0, 0.0, 0.0); //将局部坐标系的位置向左平移一个单位。
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);

glTranslatef (1.0, 0.0, 0.0);
glPushMatrix(); //记住了shoulder旋转后的局部坐标进行平移后的操作
glScalef (2.0, 0.4, 1.0);
glutWireCube (1.0);
glPopMatrix();
//调用glTranslate()函数指定关节的位置,并调用了glRotate()使得长方体绕关节旋转后,应该将局部坐标的原点平移到
//长方体的中心,并对立方体进行缩放,然后绘制该立方体。

问题1: 这是绘制机器人的一段代码,按照绘图的思路,本不是应该先画一个立方体,然后如果你想要达成什么效果,对其进行相应的模型变换么?这段代码前半部分暂且不说,就
glScalef (2.0, 0.4, 1.0);
glutWireCube (1.0);
为什么不能写成
glutWireCube (1.0);
glScalef (2.0, 0.4, 1.0);
问题2:这段代码中使用的是glTranslate()函数指定关节的位置,那是移动了局部坐标系后的一个位置,如何你能保证最后的缩放后的那个立方体的关节就在之前你设置好的那个位置呢?
问题3:我对其中的glPushMatrix();glPopMatrix();过多的调用表示不甚理解,求指导。
展开
 我来答
普洛智应
推荐于2016-02-27 · 知道合伙人互联网行家
普洛智应
知道合伙人互联网行家
采纳数:410 获赞数:1586
虚拟现实(VR/AR)以及游戏相关技术,物联网以及传感器技术

向TA提问 私信TA
展开全部

先回答

问题3,这对函数的调用就是保证他们之间的变换不会作用于以外的任何绘制,比如绘制第一个立方体缩放时不调用glPushMatrix()和glPopMatrix(); 你看看后面的绘制效果。实际上就是保存当前矩阵和恢复当前矩阵啊。。。要是我没解释清楚接着问吧


问题1,OpenGL是管道机制的,变换是按顺序作用于后面的绘制,所以

glutWireCube (1.0);
glScalef (2.0, 0.4, 1.0);//这个变换不会作用于他之前的坐标点


问题2,就上臂来说,缩放后的立方体X方向是两个单位长,如果你直接做旋转那个是绕着立方体X方向的中间转,所以先右移一个单位,再旋转就是绕着立方体左端旋转了,然后再挪回一个单位。。。由于glPushMatrix()和glPopMatrix(); 的搭配调用,实际上对上臂的变换是作用于前臂的。画前臂同样是先右移以保证绕左端旋转而不是中间,然后再右移一个单位把它接到上臂那个立方体右端。

下面贴出的代码按照glPushMatrix()和glPopMatrix()对缩进,看看是不是容易看清些

   glPushMatrix();
   glTranslatef (-1.0, 0.0, 0.0);
   glRotatef ((GLfloat) shoulder, 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) elbow, 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();
来自:求助得到的回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式