这就是我想要的,有人在网上写过,但我以前从不使用过四元数,所以不知道如何实现它。我相信这只是一个简单的等式,但如何在c / c ++代码中实现?
Here:
"You could use a bone stored as a vector made of 2 points (Head,Tail).
Since you are rotating it, Head will be the fulcrum and Tail will rotate
around an arbitrary axis. That's a quaternion's job."
我有圆柱网格的所有顶点的绝对位置,现在如果我在顶端和底端创建两个矢量/点V1(x,y,z)和V2(x,y,z),那么我将是只需转换V2(顶端)点即可转换网格顶点,但V1(底端)不应改变其位置。
我可以在带有glutSolidCylinder的OpenGL中完成,它很简单,但是我想用网格顶点实现,所以每个顶点都应该在顶部或底部矢量/点的任何变化后更新。
感谢。
答案 0 :(得分:1)
我使用1个变换矩阵+骨骼长度
你怎么知道哪个轴只旋转2点?因此,请transform matrix代表骨骼来源。一个轴是骨骼轴(红色),另一个是关节的旋转轴(绿色),最后一个是垂直于每个(蓝色)。还需要骨骼大小(长度)(橙色)
现在网格是一块骨头
根子网格是起始点,顶层骨骼通过关节连接到它。第二层骨骼连接到第一层骨骼,依此类推...... 因此,您必须添加当前骨骼连接的前一个骨骼/子网格的索引,并且还可以添加连接的下层骨骼列表以加快处理
绘图/计算
此任务实际上只是正向运动学,因此将根骨骼转换/旋转到所需的对象位置。拿它矩阵并将其存储到某个温度。绘制/处理根子网格/骨骼。
现在for
遍历所有直接连接的子网格/骨骼并获取其矩阵并计算temp和它的乘法。顺序取决于矩阵样式(行/列方式),这可以获得子网格/骨骼的实际矩阵。
因此,在移动到下一个骨骼之前,将其作为根子网格/骨骼处理,然后沿骨骼长度沿蓝色轴平移此矩阵,并递归处理所有下一个骨骼......
关节旋转
现在您可以为每个骨骼添加一个或两个旋转角度。我使用1自由度旋转,所以我会围绕绿轴旋转。简单乘以旋转矩阵无需四元数。
要么记住新矩阵(旋转)或角度,并在使用骨骼之前创建旋转矩阵,但要始终记住原始矩阵以避免累积舍入误差
<强> [注释] 强>
了解更多信息google direct或forward kinematics问题。另外CCD and Inverse Kinematics可能有助于 OpenGL 中有大量的机器人手臂示例,因此搜索...您可以将任何运动转换为单轴线性和角度执行器的集合