基于Open GL的现代着色器:3D对象的分层建模

时间:2014-09-29 10:39:44

标签: opengl graphics

我正在尝试使用立方体,球体等来模拟人体。

但我不知道如何在OpenGL 3.3+中实际建模分层几何。 例如,如果肩部旋转,它也应该移动手臂(而不是将手臂放在原来的位置)。从某种意义上说,我如何“连接”或“链接”这样的对象?也就是说,手臂应该连接到肘部的肩部,躯干应该连接到臀部的腿部......等等。

是否有良好的资源可以用代码解释这个?

3 个答案:

答案 0 :(得分:1)

实际上它非常简单:

您创建一个对象矩阵以应用转换,并创建一个堆栈来存储副本

mat4 objectMatrix;
stack<mat4> stack;

然后你可以模拟旧的固定功能管道:

stack.push(objectMatrix);
objectMatrix.translate(shoulderOffset);
objectMatrix.rotate(shoulderRotation);
glUniformMatrix4fv(OBJECTMAT, 1, GL_FALSE, objectMatrix.data());
glDrawArrays(GL_TRIANGLES, shoulderStartIndex, shoulderNumVertices);

{
    stack.push(objectMatrix);
    objectMatrix.translate(armOffset);
    objectMatrix.rotate(armRotation);
    glUniformMatrix4fv(OBJECTMAT, 1, GL_FALSE, objectMatrix.data());
    glDrawArrays(GL_TRIANGLES, armStartIndex, armNumVertices);

    //and so on

    objectMatrix = stack.pop();
}

objectMatrix =  stack.pop();

你也可以在着色器中推送所有使用的矩阵(对于所有&#34;骨骼&#34;),如上面构造的那样,并为每个顶点添加权重列表,以便在着色器中执行以下操作

mat4 objMat =  mat4(0,0,0,0,
                    0,0,0,0,
                    0,0,0,0,
                    0,0,0,0);
for(int i = 0; i< 10){
    obj+=matrices[i]*weights[i];
}

这将在均匀更改和绘制调用的数量上更轻,并允许混合矩阵

答案 1 :(得分:1)

看起来您正在尝试实现骨骼(骨骼)动画。我认为对于刚接触3D图形的人来说这是一个相当复杂的主题。

实现方式因使用固定或基于着色器的管道而异;维也纳或立即模式。

Google上的快速搜索返回了这个:

答案 2 :(得分:0)

首先,这个问题并非真正与图形相关,而是与逻辑相关。

首先,我们将对象结构建模为树,例如我们的躯干是树的根。树上的每个节点都将包含一个模型,一个表示该模型的矩阵以及有关该节点如何与其父节点相关的一些信息。例如,其原点是正X中的5个单位,负Y中的1个单位和远离父母原点的Z中的0个单位。

现在有了这些信息,我们可以做很多事情,当我们绘制模型时,我们将保留整体平移和旋转矩阵。我们首先绘制根,并将其矩阵应用于其顶点。然后我们绘制它的每个子节点,并将根节点中所做的更改传播给它的所有子节点。这意味着每次我们的根节点移动时,它的所有子节点都会随之移动,它的子节点也会移动。我们也可以对每个节点应用旋转,实际上你可以在每个节点中存储任何其他信息,它都依赖于在你的设计上。

这只是一个非常基本的想法,你可以如何实现你正在寻找的东西,还有其他技术可以用来模拟这种行为,一些是基于骨骼的,并允许更多的动画自由,但是更复杂。我建议先把它弄下来,然后转移到更复杂的东西上。至于绘制顶点,你可以在每个节点中有一个网格对象,它有一个VBO和一个简单的绘制方法,这实际上是微不足道的,它实际上只是加载一些顶点信息然后就是它。您的翻译矩阵和旋转矩阵将完成其余的工作。

希望这有帮助!