现代OpenGL问题

sev*_*and 7 opengl graphics

在我的OpenGL研究中(我认为是OpenGL红皮书),我发现了一个关节机器人手臂模型的例子,它包括一个"上臂",一个"下臂",一个"手",以及五个或更多"手指".每个部分应该能够独立移动,但受"关节"约束(上部和下部"臂"始终连接在"肘部").

在立即模式(glBegin/glEnd)中,它们使用一个立方体的网格,称为"成员",并使用该单个网格的缩放副本用于手臂,手等的每个部分."移动"通过推动完成旋转到下面每个关节的转换矩阵堆栈:肩膀,肘部,手腕,关节 - 你得到了图片.

现在,这解决了问题,但由于它使用旧的,不推荐的立即模式,我还不了解现代OpenGL上下文中这个问题的解决方案.我的问题是:如何使用现代OpenGL解决这个问题?特别是,每个"成员"是否应该跟踪自己当前的转换矩阵,因为矩阵堆栈不再是犹太人?

Mik*_*ola 4

差不多了。如果您确实需要它,实现您自己的类似堆栈的接口非常简单。您实际上只需存储一个堆栈,然后使用您喜欢的数学库实现您需要的任何矩阵运算,并通过某种方式使用堆栈的顶部元素初始化您所需的矩阵统一。

在您的机器人手臂示例中,假设连杆表示为树(如果您愿意,甚至可以表示为图表),并在每个主体之间指定相对变换。要绘制机器人手臂,您只需遍历此数据结构并将任何一个子体的变换设置为与其自身组合的父体的变换。例如:

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)
Run Code Online (Sandbox Code Playgroud)