9

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

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

4

2 回答 2

11

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

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

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

在此处输入图像描述

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

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

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

于 2012-12-25T13:27:41.450 回答
8

但是您如何定义可能具有关节的 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

完全无关

于 2012-12-25T13:23:47.363 回答