通过翻译和轮换从一个笛卡尔3D坐标系统转换到另一个系统

时间:2015-07-08 06:48:30

标签: matlab math 3d geometry coordinate-transformation

我有两个理由提出这个问题:

  1. 我想知道我对这个问题的理解是否正确。
  2. 澄清我的怀疑。
  3. 我想改变一组点的坐标系(旧笛卡尔坐标系到新的笛卡尔坐标系)。这种转变将涉及翻译和轮换。这就是我打算做的事情:

    enter image description here

    对于该图像,我有一组位于XYZ坐标系(红色)中的点。我想相对于轴UVW(紫色)改变它。为了做到这一点,我理解有两个步骤:翻译和轮换。

    当我翻译时,我只改变原点。 (比方说,我希望UVW原点在(5,6,7)。然后,对于我数据中的所有点,x坐标将被减去5,y减去6,z减去7.这样做.I获取一组翻译数据。)

    现在我必须应用旋转变换(在Translated数据上)。旋转矩阵显示在图像中。值Ux,Uy和Uz是U轴上与原点的单位距离的点的坐标。类似地,值Vx,Vy和Vz是V轴上与原点具有单位距离的点的坐标。 (我想知道我是不是在这里。)Wx,Wy,Wz计算为((标准化u)X(标准化v))

    (另外,如果它有任何用途,我想告诉你我正在使用MATLAB。)

    编辑:

    我在3D中有一组42个点(42 X 3矩阵 A )我希望第一个点被视为 UVW 平面的原点。所以第一点的值将是我的翻译向量。正确?

    接下来,计算旋转矢量:根据我的要求,矩阵 A 的第6行必须是 U 轴,而第37行必须是 V 轴。因此,vector u 将是矩阵 A 的(第1行减去第6行)。 vector v 将是矩阵 A 的第一行减去第37行。

    旋转矩阵的第一行将是向量u/|u|(标准化)。第二行将是向量v/|v|(v标准化)。第三行将是(u X v)。我在这儿吗?

3 个答案:

答案 0 :(得分:2)

  

根据这些信息,我如何计算Wx,Wy和Wx的值。如何计算第3行旋转矩阵R?

由于你已经有U和V,即正交UVW系统的两个基矢量,W基矢量将是U和V的叉积。交叉乘积给出垂直于其操作数的矢量;因此W = U×V。W的分量将填充旋转矩阵的第三行。

  

我的方法是否正确?

变换的顺序很重要;改变顺序会导致不同的结果。在进行系统转换时,通常首先处理缩放和旋转,最后处理转换。原因是旋转总是相对于原点。如果新系统不在旧系统的原点上,那么应用旋转将使新系统不是围绕其自己的原点而是围绕旧系统的原点旋转。请参阅this page上图3-4的右侧情况,了解如果它不在原点上会发生什么情况;将锅想象成UVW坐标系。

想想两个坐标系都是超强的(在另一个上面放置)。现在,当您相对于XYZ的原点旋转UVW系统时,您将最终获得旋转UVW w.r.t自身原点的效果。一旦正确定位,您可以对其进行翻译。但是,如果您已经翻译过,那么旋转将导致翻译轮换。

如果您正在使用列向量约定,那么TR将是顺序,即旋转后跟翻译。如果你正在使用行向量约定,那么RT将是顺序,顺序是循环,然后是翻译。

答案 1 :(得分:1)

您可以应用Vectors OU和OV的叉积。

答案 2 :(得分:0)

我认为分步执行它会更容易。 1)翻译。 2)绕x轴旋转。 3)绕y轴旋转。 4)绕z轴旋转。

% Assuming this is your coordinates before any operation
x0 = 5; y0 = 5; z0 = 5;

% This is the new origin
u = 5; v = 6, w = 7;

% If you wish to rotate pi/4 about x-axis, pi/3 about y-axis, pi/2 about z- axis, the three representative rotation matrix will be:
rx = [1 0 0; 0 cos(pi/4) -sin(pi/4); 0 sin(pi/4) cos(pi/4)];
ry = [cos(pi/3) 0 sin(pi/3); 0 1 0; -sin(pi/3) 0 cos(pi/3)];
rz = [cos(pi/2) -sin(pi/2) 0; sin(pi/2) cos(pi/2) 0; 0 0 1];

% First perform translation
xT = x0-u;  yT = y0-v; zT = z0-w;

% Then perform rotation about x
rotated_x = mtimes( rx,[xT;yT;zT]);

% Then perform rotation about y
rotated_xy = mtimes( ry, rotated_x);

% Then perform rotation about z
rotated_xyz = mtimes( rz, rotated_xy);