【问题标题】:Using 3d transformation matrices使用 3d 变换矩阵
【发布时间】:2009-02-25 02:12:57
【问题描述】:

在一个 AI 类中,我们有一个机器人,它的手臂有 7 个关节。每个关节可以旋转不同的方向。我需要知道最后会在哪里。我一直在尝试进行 3d 矩阵乘法,它适用于一个关节,但是一旦我添加另一个关节,它就不会与我使用 Java3D api 制作的模型对齐。这就是我试图计算第二个关节位置的方式。

double[][] b = {{0, 0, 0, 1}};

// Joint 1
b = HercMatrix.MatMul(b, HercMatrix.getTranslation(0, 0, -110));
b = HercMatrix.MatMul(b, HercMatrix.getRotation(0, arm.getJointAngle(0), 0));

// Joint 2
b = HercMatrix.MatMul(b, HercMatrix.getTranslation(0, 0, -250));
b = HercMatrix.MatMul(b, HercMatrix.getRotation(arm.getJointAngle(1), 0, 0));

System.out.println("Matrix: " + b[0][0] + ", " + b[0][1] + ", " + b[0][2]);

我想这是我应用乘法的方式。我知道事实上这不是我的 matmul 或矩阵生成代码,我已经单独测试了所有这些。

第二个平移需要在第一个关节角度的相对 x 轴上。但我不知道我是不是这样做的......

非常感谢任何帮助或想法。

【问题讨论】:

    标签: java 3d matrix


    【解决方案1】:

    如果不查看仿射变换矩阵的结构和角度变量的定义,很难准确回答。 translation matrix 的正常定义假设位置向量是从左边相乘的,例如,这似乎与您的使用相反。最后还要检查 b[0][3]==1。

    您的代码似乎等同于以下伪代码:

    b = origin.translate(Joint1).rotate(Joint1).translate(Joint2).rotate(Joint2);
    

    这不等于

    b = origin.translate(Joint2).rotate(Joint2).translate(Joint1).rotate(Joint1);
    

    所以请检查您需要的转换顺序。

    【讨论】:

    • 这实际上是问题所在。谢谢你的建议!
    猜你喜欢
    • 2011-12-02
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多