如何在openGL中实现关节和骨骼?

chu*_*tsu 8 opengl

我正在滚动自己的openGL框架,并且知道如何绘制3d对象......等等......

但是,如何定义可能具有关节的3d对象之间的关系?或者如何将3d对象定义为"骨骼"?有什么好资源吗?

s3r*_*ius 10

由于OpenGL只是一个图形库而不是3D建模框架,因此定义和使用"骨骼"的任务落在你身上.

实际实现它有不同的方法,但总体思路是:

您将模型的每个部分视为骨骼(例如头部,躯干,小腿,大腿等).
每个骨骼都有一个与之相连的父母(例如,左下腿的父母是左上腿).
因此,每个骨骼都有许多孩子.

在此输入图像描述

现在,您将每个骨骼的位置定义为父骨骼的相对位置.在显示骨骼时,您现在将其相对位置与父骨骼的相对位置相乘以获得绝对位置.

想象
一下:把它想象成一个洋娃娃.当你抓住玩偶的手臂并移动它时,手的相对位置(和旋转)不会改变.它的绝对位置会改变,因为你已经移动了它的一个父母.

当尝试骨架动画时,我从这个链接中学到了大部分内容:http://content.gpwiki.org/index.php/OpenGL : Tutorials : Basic_Bones_System

  • 这里有一点3D动画师的秘密:在反向运动学动画系统中,平移(即位置)根应放置在脚之间的中间点.这样可以避免在设置步行循环动画时遇到很多麻烦.它还使运动看起来更自然. (2认同)

dat*_*olf 8

但是,如何定义可能具有关节的3d对象之间的关系?

OpenGL并不关心这些事情.我不是一个纯粹的绘图API.因此,您可以释放自己的创造力并自己定义这样的结构.骨骼动画的常用方法是使用骨骼/装备系统,其中每个骨骼具有方向(由四元数或3×3矩阵表示)长度和进一步附加到其上的骨骼列表,即某种树.

我将这个结构定义为

typedef float quaternion[4];

struct Bone {
    quaternion orientation;
          float length;

            int  n_subbones;
           Bone *subbones;
};
Run Code Online (Sandbox Code Playgroud)

除此之外,您还需要一个从钻机开始的枢轴.我会这样做的

typedef float vec3[3];

struct GeomObjectBase {
           vec3 position;
    quaternion orientation;
};

struct BoneRig {
    struct GeomObjectBase gob;

    struct Bone pivot_bone;
}
Run Code Online (Sandbox Code Playgroud)

接下来,您需要一些遍历此结构的函数,从中生成矩阵调色板,以便将其应用于模型网格.

注意:我正在使用freeglut

完全无关紧要