关于坐标的平移变换

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();

}

我有更好的答案

分享到:

1条回答

2012-04-02 21:29StarArchon | 一级 最快回答

先前我在调用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步前的变换状态
相信已解释得够通俗的了,不懂再问吧~
  • 追问

  • 这段代码是为了做一个机器人手臂的旋转的!但我不知道为什么第二个(就是你的编号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应该是尺寸的参数吧


转载于:https://my.oschina.net/u/1469992/blog/220795

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值