2011-06-27 25 views
7

在我的OpenGL研究(OpenGL的红皮书,我认为)我碰到组成的“上臂”的关节机械手的模型的例子,一个“下臂”,“手”来了,以及五个或更多“手指”。每个部分应该能够独立移动,但受到“关节”的约束(上臂和下臂总是连接在“肘”处)。现代OpenGL的问题

在即时模式(glBegin/glEnd)中,它们使用称为“成员”的立方体的一个网格,并将该单个网格的缩放副本用于手臂,手等的每个部分。“移动”是通过将旋转推动到转换矩阵堆栈上以实现以下每个关节:肩膀,肘关节,手腕关节 - 您可以获得图片。现在

,这能解决问题,但因为它是使用旧的,过时即时模式,我还不知道在现代OpenGL上下文的解决了这个问题。我的问题是:如何使用现代OpenGL来解决这个问题?特别是,每个“成员”是否应该跟踪自己当前的变换矩阵,因为矩阵栈不再是犹太教?

回答

3

漂亮多了。如果你真的需要它,实现你自己的栈式界面非常简单。你会直接存储一个堆栈,然后用你喜欢的数学库实现你需要的任何矩阵操作,并且有一些方法可以使用堆栈的顶层元素来初始化你想要的矩阵。

在您的机器人手臂示例中,假设链接表示为树(或者如果您愿意,甚至是图表),并在每个主体之间指定相对转换。为了绘制机器人手臂,您只需遍历此数据结构,并将任意一个子体的转换设置为由它自己组成的父体转换。例如:

def draw_linkage(body, view): 

    //Draw the body using view matrix 

    for child, relative_xform in body.edges: 

     if visited[child]: 
      continue 

     draw_linkage(child, view * relative_xform) 
1

在刚性部件,通过接头连接的情况下,人们通常将每个部分作为individial子网,拉丝之前加载相应的矩阵。

在“连接” /“连续”的网格的情况下,像面,动画通常是通过骨骼和变形目标发生。其中每个定义一个变形,并且网格中的每个顶点都被赋予一个重量,它受到每个变形器的影响有多强。从技术上讲,这也可以应用于刚性肢体模型,给予每个肢体单个变形器非零权重。

在任何像样的动画系统跟踪的变换(矩阵)本身,无论如何,OpenGL的矩阵堆栈功能罕在严重的应用中(因为OpenGL的被发明)。但通常这些转换存储在一个层次中。

1

您通常使用场景图在openGL以上的级别执行此操作。

场景图树中每个节点上的相同矩阵变换只是简单地映射到OpenGL矩阵上,所以它非常高效。