我正在滚动自己的openGL框架,并且知道如何绘制3d对象......等等......
但是,如何定义可能具有关节的3d对象之间的关系? 或者如何将3d对象定义为“骨骼”? 有没有好的资源?
答案 0 :(得分:10)
由于OpenGL只是一个图形库而不是3D建模框架,因此定义和使用“骨骼”的任务落在你身上。
实际实现它有不同的方法,但总体思路是:
您将模型的每个部分视为骨骼(例如头部,躯干,小腿,大腿等)。
每个骨骼都有一个与之相连的父母(例如,左下腿的父母是左上腿)
因此,每个骨骼都有许多孩子。
现在,您将每个骨骼的位置定义为父骨骼的相对位置。在显示骨骼时,您现在将其相对位置与父骨骼的相对位置相乘以获得绝对位置。
想象:
把它想象成一个洋娃娃。当你抓住玩偶的手臂并移动它时,手的相对位置(和旋转)不会改变。它的绝对位置会改变,因为你已经移动了它的一个父母。
当尝试骨骼动画时,我从这个链接中学到了大部分内容: http://content.gpwiki.org/index.php/OpenGL:Tutorials:Basic_Bones_System
答案 1 :(得分: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
完全无关