这就是我想要的,有人在网上写过,但我从来没有用过四元数,所以不知道如何实现它。我确信这只是一个简单的等式问题,但是如何在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中完成,它非常简单,但是这里我想用网格顶点来实现,所以每个顶点在上下向量/点发生任何变化后都应该更新。
谢谢。

最佳答案

我使用1个变换矩阵+骨骼长度
你怎么知道什么轴只有2点旋转?因此,使transform matrix代表骨起源一个轴是骨轴(红色),另一个轴是关节(绿色)的旋转轴,最后一个轴垂直于每个(蓝色)。还需要骨骼大小(长度)(橙色)
现在网格是一棵骨头树
根子网格是起点,顶层骨骼通过关节连接到它。第二层骨骼连接到第一层骨骼,依此类推…
因此,必须添加当前骨骼连接的前一个骨骼/子网格的索引,还可以添加连接的下层骨骼的列表,以加快处理速度
绘图/计算
此任务实际上只是正向运动学,因此将根骨骼平移/旋转到所需的对象位置把它放在基质里,放在临时的地方绘制/处理根子网格/骨骼。
现在for循环遍历所有直接连接到它的子网格/骨骼,获取它的矩阵并计算temp和它的乘法。顺序取决于矩阵样式(行/列),这将获得子网格/骨骼的实际矩阵。
因此,在移植到下一骨之前,将其作为根子网/骨处理,沿着骨轴线将该矩阵沿蓝色轴平移,并递归地处理下一个骨…
关节旋转
现在可以为每个骨骼添加一个或两个旋转角度。我使用1度的自由旋转,所以我将围绕绿色轴旋转。简单的旋转矩阵乘法不需要四元数。
在使用骨骼之前,记住新的矩阵(旋转)或角度并创建旋转矩阵,但始终记住原始矩阵以避免累积舍入误差
[注]
更多信息谷歌直接或正向运动学问题。而且CCD and Inverse Kinematics可能有助于OpenGL中有大量的机械臂示例,因此搜索可以将任何运动学转换为单轴直线和角致动器的集合。

10-06 05:23