2014-09-29 57 views
0

我试图使用多维数据集,球体等对人体进行建模。基于现代着色器的Open GL:3D对象的分层建模

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

是否有很好的资源可以用代码解释这一点?

回答

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(); 

您也可以在着色器中推送所有用过的矩阵(对于所有“骨骼”),并为每个顶点添加一个权重列表,以便您可以执行E在着色器下面

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]; 
} 

这将是统一的更改次数更轻,绘图调用,并允许矩阵

0

首先,这个问题是不是真的如相关等,它更多的逻辑关系的图形。

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

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

这只是一个非常基本的想法,你可以如何实现你正在寻找的东西,还有其他技术可以用来模拟这种行为,有些是基于骨骼的,并且允许更多的动画自由,但是更复杂得多。我建议先解决这个问题,然后再转向更复杂的东西。至于画你的顶点,你可以在每个有VBO和简单绘制方法的节点中有一个网格对象,但这实际上很简单,它的字面上只是加载一些顶点信息,然后就是这样。您的翻译矩阵和旋转矩阵将完成其余部分。

希望这会有所帮助!