现代OpenGL问题

7
在我研究OpenGL(我认为是OpenGL红皮书)时,我遇到了一个例子,展示了由“上臂”,“下臂”,“手”和五个或更多的“手指”组成的活动机械臂的模型。每个部分都应该能够独立移动,但受到“关节”(上臂和下臂始终在“肘部”连接)的约束。
在立即模式(glBegin/glEnd)中,他们使用一个立方体网格,称为“member”的单个网格,并使用该单个网格的缩放副本为手臂、手等的每个部分。通过将旋转推送到以下关节的变换矩阵堆栈中来完成“移动”:肩膀、肘部、手腕、指节-你明白了。
现在,这解决了问题,但因为它使用了旧的、已弃用的立即模式,我还不理解怎么在现代OpenGL环境下解决这个问题。我的问题是:如何使用现代OpenGL解决这个问题?特别是,由于矩阵堆栈不再被支持,每个单独的“member”是否应该跟踪其自身的当前变换矩阵?
3个回答

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)

1

在刚性部件通过接头连接的情况下,通常将每个部件视为单独的子网格,在绘制之前加载适当的矩阵。

对于“连接”/“连续”的网格(如面部),动画通常通过骨骼和变形目标实现。每个骨骼和变形目标都定义了一种变形方式,并且网格中的每个顶点都被分配了一个权重,表示它受每个变形器影响的强度。从技术上讲,这也可以应用于刚性肢体模型,给每个肢体分配一个单一的变形器非零加权。

任何体面的动画系统都会自己跟踪变换(矩阵),OpenGL矩阵堆栈函数很少在严肃的应用程序中使用(因为OpenGL已经发明)。但通常变换是存储在层次结构中的。


1

一般情况下,您需要使用场景图在openGL之上进行操作。

在场景图树的每个节点处使用相同的矩阵变换映射到openGL矩阵,因此非常高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接