c++ - 如何创建一个圆柱形骨骼,存储为由 2 个点(头、尾)组成的 vector ?

标签 c++ c algorithm 3d transformation

这就是我想要的,有人在网上某个地方写过,但我以前从未使用过四元数,所以不知道如何实现它。我确信这只是一个简单方程式的问题,但如何在 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."

我有圆柱形网格所有顶点的绝对位置,现在如果我在顶端和底端创建两个 vector/点 V1(x, y, z) 和 V2(x, y, z),那么我将是可以通过仅变换 V2(顶端)点来变换网格顶点,但 V1(底端)不应改变其位置。

我可以在 OpenGL 中使用 glutSolidCylinder,它非常简单,但在这里我想用网格顶点来实现,所以每个顶点都应该在顶部或底部 vector/点发生任何变化后更新。

谢谢。

最佳答案

  1. 我改用 1 个变换矩阵 + 骨骼长度

    您如何知道仅从 2 个点绕哪个轴旋转?所以制作transform matrix代表骨源。一个轴是骨骼轴(红色),另一个是关节的旋转轴(绿色),最后一个轴垂直于每个轴(蓝色)。还需要骨骼大小(长度)(橙色)

    img

  2. 现在网格是一棵骨头树

    根子网格是起点,顶层骨骼通过关节连接到它。第二层骨骼连接到第一层骨骼,依此类推...... 因此,您必须添加当前骨骼连接到的先前骨骼/子网格的索引,并且还可以添加连接的下层骨骼列表以加快处理速度

  3. 绘图/计算

    此任务实际上只是正向运动学,因此将根骨骼平移/旋转到所需的对象位置。取它矩阵并将其存储到某个温度。绘制/处理根子网格/骨骼。

    现在 for 遍历所有直接连接的子网格/骨骼到它并获取它的矩阵并计算 temp 和它的乘积。顺序取决于矩阵样式(行/列方式),这将为您提供子网格/骨骼的实际矩阵。

    因此在移动到下一个骨骼之前将其作为根子网格/骨骼处理,将此矩阵沿蓝轴按骨骼长度翻译并递归处理所有下一个骨骼 ...

    查看旧的 OpenGL API 实现:Rotating a multipart object

  4. 关节旋转

    现在您可以为每个骨骼添加一个或两个旋转角度。我使用 1 个自由度旋转,所以我会围绕绿色轴旋转。旋转矩阵的简单乘法,不需要四元数。

    要么记住新矩阵(旋转)或角度,并在使用任何骨骼之前创建旋转矩阵,但始终记住原始矩阵以避免累积舍入误差

[注释]

有关谷歌直接或正向运动学问题的更多信息。还有 CCD and Inverse Kinematics OpenGL 中有大量的机械臂示例可能会有所帮助,因此搜索...您可以将任何运动学转换为一组单轴线性和角度执行器

对于游戏和演示,您可以使用 BVH 文件为您的网格制作动画,请参阅:

关于c++ - 如何创建一个圆柱形骨骼,存储为由 2 个点(头、尾)组成的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29095508/

相关文章:

c++ - openCV imread 限制大或巨大的图像 Mat bug #3258

c++ - sizeof(arr)/sizeof(arr[0]) 是如何工作的?

c - 在 VC++ 中正确实现 Dll 和库

c - 从长度未知的字符串中读取所有 double

python - 排列 5(或 6)个列表

algorithm - O(1) 额外空间查找数据结构

c++ - 为什么将字符串放入结构中会导致崩溃?

c++ - 将元素从 char vector 复制到字符串 vector

c - 是否可以在不调用main函数的情况下调用函数?

c++ - 检查子集是否包含给定子集列表的快速方法