如何绘制一个可以在 OpenGL 中拾取物体的机械臂?
Posted
技术标签:
【中文标题】如何绘制一个可以在 OpenGL 中拾取物体的机械臂?【英文标题】:How to draw a robotic arm which can pick objects in OpenGL? 【发布时间】:2013-10-23 01:03:42 【问题描述】:我在实现一个可以拾取物体的机械臂时遇到了麻烦,因为我在实现中调用了 glTranslate()、glRotate() 调用,机器人的每个部分都依赖于前一部分。
例子:
void drawRobo()
draw a Cylinder as Base;
glTranslate();
drawArmpart1();
glTranslate();
drawJoint1();
glRotate();
drawArmpart2();
glTranslate();
drawGrabbers(); // The claw or the endeffector
void drawObjects()
glTranslate();
drawCube() // Object
glTranslate();
drawSphere() // Object 2
void display()
drawRobo();
drawObjects();
glPostredisplay();
现在的问题是当我使用 glRotate() 旋转末端执行器或抓取器时;我的对象也会旋转,我不希望这样。我希望能够旋转关节和手臂,使其更靠近物体,然后我想使用抓取器拾取它们。
我该如何处理?我在所有需要它们的地方都有 glPushMAtrix() 和 glPopMatrix() 命令。
【问题讨论】:
【参考方案1】:既然你有这个问题,很明显你没有有适当的推送和弹出矩阵操作。你的伪代码应该是:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// setup view matrix
glPushMatrix();
// setup robot's world matrix
drawRobo();
glPopMatrix();
// setup object's world matrix
drawObjects();
glutPostRedisplay();
请注意,最后一次绘制调用不使用 push/pop - 只是因为它是最后一次,所以您不需要在它之后恢复矩阵。
【讨论】:
谢谢,我的对象不再旋转了.. last glPopMatrix();放错地方了。另外,我怎么知道我的手臂已经靠近一个物体,以便我可以捡起它?物体从末端执行器平移和旋转,然后绘制......有没有一种简单的方法来获得反向变换,以便所有东西都在同一个坐标空间中? 有。您可以计算机器人的世界矩阵(与传递给 GL 的值相同)并将其乘以手臂坐标。结果,您将在世界(即全局)空间中获得您的手臂位置。然后length(arm_position - object_position)
会给你距离。这将需要一些线性代数和向量代数的知识 - 但老实说,这根本与 GL 无关 - 只是数学。以上是关于如何绘制一个可以在 OpenGL 中拾取物体的机械臂?的主要内容,如果未能解决你的问题,请参考以下文章