0

我有一个关于手术机器人手臂在 OpenGL 中的运动的问题。

我们的手臂由 7 块组成,它们被认为是手臂的关节,它们负责弯曲和扭转手臂。我们以这种方式绘制手臂:首先我们创建负责像“上下”一样移动肩膀的元素,然后我们使用 Translatef “移动”到我们绘制下一个元素的点,负责扭转肩膀(我们使用 Rotatef 控制运动,以此类推下一个关节(肘部、手腕)。

关键是要创造一个可以做出类似人类动作的手臂。我们的机制有效,但现在我们的导师要我们用手臂末端画一条线。我们将负责绘制和移动手臂的代码放在 push 和 pop 矩阵之间,所以它的工作原理就像在现实中一样,我的意思是当我们移动灵魂时,手臂中的任何其他元素也会移动。

有很多元素在移动、旋转,我们有几个旋转矩阵,它们附加到我们可以控制的不同元素上,现在我们不知道如何在空间中精确地找到手臂末端的新位置能够将新点添加到线带。任何人都可以帮忙吗?

    glGetFloatv(GL_MODELVIEW_MATRIX,mvm2);

     x=mvm2[12];
     y=mvm2[13];
     z=mvm2[14];

     glPointSize(5.0f);
     glColor3f(1.0f, 0.0f, 0.0f);

     glBegin(GL_POINTS);
     glVertex3f(x,y,z);
     glEnd();

当我使用手表检查 x、y、z 值是什么时,我得到 (0,-1.16-12e,17.222222),这是不可能的,因为我的手臂长度约为 9.0(在 z 轴上)。我认为只有模型视图矩阵的最后一列很重要,我不必将它乘以顶点的局部坐标,因为它们是 (0,0,0),因为我在这里完成了我的绘图。

4

2 回答 2

3

我们不知道如何在空间中精确地找到手臂末端的新位置,以便能够将新点添加到线条上。

您可以通过自己执行矩阵数学和转换来做到这一点。

(来自评论)

为此,我们假设将矩阵相乘并从 glGetFloatv 中获取一些信息

请不要这样做。如果您应该自己构建预转换的线带几何图形,则尤其如此。OpenGL 不是一个矩阵数学库,使用 OpenGL 的固定函数管道矩阵函数绝对没有任何好处。但它有很多缺点。最好使用真正的矩阵数学库。

从技术上讲,您的机器人手臂由许多连接的段组成,其中每个段通过变换层次结构中向上段的变换组合进行变换。

M_i = M_{i-1} · (R_i · T_i)

其中 R_i 和 T_i 分别是每个段的旋转和平移。因此,对于每个线段,您需要单独的变换矩阵来检索线段的点。

由于您将每个线段的原点放置在前一个线段的尖端,因此您将使用线段的变换矩阵变换齐次点 (0,0,0,1),该矩阵具有恰好是第 4 列的好属性变换矩阵。

这留给您创建转换矩阵链的任务。用 OpenGL 做这件事很乏味。为此使用真正的数学库。如果你的导师坚持让你使用OpenGL固定函数管道,请让他给你看当前OpenGL版本(OpenGL-3及更高版本)规范中的函数参考;他找不到它们,因为所有矩阵数学函数都已从现代 OpenGL 中完全删除。

对于数学库,我可以推荐GLMEigen(带有 OpenGL 额外模块)和linmath.h(自我广告)。使用这些库中的每一个,构建转换层次结构都很简单,因为您可以轻松创建每个中间矩阵的副本。

于 2013-05-12T17:26:19.863 回答
0

如果您应该使用glGetFloatv,那么 this 指的是使用参数调用它,该GL_MODELVIEW_MATRIX参数返回当前模型视图矩阵。然后,您可以使用此矩阵将点从手的坐标系转换到世界空间 CS。

但是,调用glGetFloatv是不好的做法,因为它可能会导致渲染性能降低。我认为您应该与您的导师讨论过时甚至已弃用的功能,也许他可以让教授更新材料。

编辑:您检索翻译的代码是正确的。但是,您不能使用相同的模型视图矩阵来绘制点。glLoadIdentity在绘制它之前,您必须使用或通过弹出来重置模型视图矩阵。

于 2013-05-13T17:54:33.057 回答