Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在openGL中实现关节和骨骼?_Opengl - Fatal编程技术网

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

如何在openGL中实现关节和骨骼?,opengl,Opengl,我正在滚动我自己的openGL框架,并且知道如何绘制3d对象。。。等等 但如何定义可能具有关节的三维对象之间的关系? 或者如何将3d对象定义为“骨骼”? 有什么好的资源吗 但如何定义可能具有关节的三维对象之间的关系 OpenGL并不关心这些事情。我不是一个纯粹的绘图API。因此,你必须释放你的创造力,自己定义这样的结构。骨骼动画的常用方法是使用骨骼/装备系统,其中每个骨骼都有一个方向(由四元数或3×3矩阵表示)、一个长度和附加到其上的骨骼列表,即某种树 我将这个结构定义为 typedef flo

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

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

但如何定义可能具有关节的三维对象之间的关系

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

我将这个结构定义为

typedef float quaternion[4];

struct Bone {
    quaternion orientation;
          float length;

            int  n_subbones;
           Bone *subbones;
};
除此之外,您还需要一个从钻机开始的枢轴。我会这样做

typedef float vec3[3];

struct GeomObjectBase {
           vec3 position;
    quaternion orientation;
};

struct BoneRig {
    struct GeomObjectBase gob;

    struct Bone pivot_bone;
}
接下来,您需要一些迭代此结构的函数,从中生成矩阵调色板,以便将其应用于模型网格

注意:我使用的是freeglut


完全不相关

因为OpenGL只是一个图形库,而不是一个3D建模框架,定义和使用“骨骼”的任务就落在你身上了

有不同的实际实施方式,但总体思路是:

将模型的每个部分视为骨骼(例如头部、躯干、小腿、大腿等)。
每个骨骼都有一个连接到的父骨骼(例如,左小腿的父骨骼是左大腿的父骨骼)。
因此,每根骨头都有若干个孩子

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

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

尝试骨骼动画时,我从以下链接了解了大部分内容:

这里有一点3D动画师的秘密:在反向运动学动画系统中,平移(即位置)根应该放在脚之间的中点。这避免了设置行走循环动画时的许多麻烦。它还使动作看起来更自然。