最近计算机图形学上的一头雾水,在看红宝书的时候看到一个机器人手臂的例子,感觉对理解局部坐标系很有帮助。记录一下学习过程。
首先我们知道在opengl中有各种坐标系。其中比较重要的是世界坐标系和对象坐标系。初始状态,世界坐标系和对象坐标系重合,而我们做出几何变换如缩放移动旋转等,对象坐标系就会发生变化,之后我们绘制的图形也会基于当前的坐标系。
void display7() {
glClear(GL_COLOR_BUFFER_BIT);
// 保存源坐标系
glPushMatrix();
// 这个移动实际上只是把手臂进行了偏移,没有别的作用
//glTranslatef(-1, 0, 0);
// 旋转,假设当前有一个长方体在原点,那么此时长方体绕着中心发生了旋转
glRotatef((GLfloat)shoulder, 0, 0, 1);
// 因为绕中心旋转是不合理的,我们需要移动坐标系,使得旋转发生在关节处
glTranslatef(1, 0, 0);
// 此时的矩阵是发生了旋转和移动到关节
glPushMatrix();
// 缩放
glScalef(2, 0.4, 1);
// 绘制手肘
glutWireCube(1);
// 恢复矩阵到旋转后的关节处状态
glPopMatrix();
// 再进行一次移动,使得当前局部坐标系原点位于手肘立方体的中心
glTranslatef(1, 0, 0);
// 旋转,与手臂相似
glRotatef((GLfloat)elbow, 0, 0, 1);
// 移动,使得手肘的旋转是绕关节发生的,与手臂相似
glTranslatef(1, 0, 0);
// 保存
glPushMatrix();
//与上述过程相似
glScalef(2, 0.4, 1);
glutWir