繁体   English   中英

使用矩阵的3D零件绝对运动

[英]absolute movement of 3D part using matrix

我正在尝试在相对坐标系和绝对坐标系中实现3D零件的转换。 我能够相对移动-也就是零件在局部坐标系中的运动,但无法在绝对(全局/模型坐标系)中正确实现。

使用的术语-1. 3D零件-在3维中绘制的任何几何体(几何体的组合)。 我正在使用在CATIA中创建的零件。 2.局部(相对)坐标系-零件的轴系。3.全局(绝对)坐标系-零件的上级的轴系。 4.组装-零件相互连接成仿制。 典型的树状结构。 这些定义符合我的用法和理解。 https://www.opengl.org/discussion_boards/showthread.php/127422-Local-and-global-coordinate-system

我的输入-

  1. 矩阵-我为装配体中的每个零件定义了4X4矩阵。 这定义了应用了“旋转”,“平移”和“比例”分量的变形矩阵。 变换矩阵其列矩阵在1-10个位置可旋转,12,13,14(右下)用于平移。

  2. 运动-我以绝对或相对单位的x,y,z值向量接收零件运动。 或围绕X,Y或Z轴以度为单位更改旋转角度。

我尝试了什么-

我按照下面的步骤来转换输入以应用于矩阵。 我必须始终将绝对更改转换为相对更改,因为我只能修改叶节点的矩阵(该矩阵始终位于局部坐标系中)。 这是我正在使用的分步操作- 新矩阵的步骤

步骤1-加入LCS。 WCS-世界坐标系; LCS-本地坐标系步骤2-取消LCS中的旋转。 备份旋转。 步骤3-将零件移至WCS。 步骤4-在WCS中移动具有所需增量的零件。 步骤5-将零件移回LCS步骤6-使用步骤1中保存的旋转度再次旋转后部。

如下所示的伪代码-使用Typescript,但其他任何语言对我来说也很好。 我对矩阵计算更感兴趣。

//// STEP 1//////

    let absVals = Matrix 4;

    /*This is accumulation of all matrices from child to parent. I take all the matrices starting from Child to the root parent and append with matrix multiplication.*/
    let localVals = Matrix4 on the child node. In our case the the box shown in image;
    let localRotation: .Matrix4 = new Matrix4(localVals);
    localRotation.setTranslation(0, 0, 0); // only local rotation matrix

    //// STEP 2//////

    let localTranslation = localVals.multiplyMatrix(localRotation.inverse()); // only local translation. Step 2 achived.

    //// STEP 3//////

    let localInGlobalSpace = localTranslation.multiplyMatrix(res); // move the part in WCS. Step 3 achieved.

    let xDelta = this.xMovement;
    let yDelta = this.yMovement;
    let zDelta = this.zMovement;
    let newPos = new Matrix4();
    newPos.setTranslation(new .Vector3(xDelta, yDelta, zDelta));
    // Similarly rotations should be handled but can skipped for first step

    //// STEP 4//////

    let movedLocalInGlobalSpace = localInGlobalSpace.multiplyMatrix(newPos); // Step 4 achived.

    //// STEP 5//////

    let localBackInLocalSpace = movedLocalInGlobalSpace.multiplyMatrix(absVals.inverse()); // Step 5 achived.

    //// STEP 6//////

    let localBackInLocalSpaceWithRotation = localBackInLocalSpace.multiplyMatrix(localRotation); // Step 6 achived.

我需要帮助以了解我是否在算法中正确执行了这些步骤。 我试图提供尽可能多的信息。 让我知道帖子是否变得难以理解。 让我知道你的看法。

我认为您的问题更多是关于数学转换,而不是代码:

每个变换都可以细分为一个简单的平移和三个旋转(沿每个轴)。 现在,我们将仅考虑1个平移和1个旋转。

应用旋转时,必须确保旋转的中心是原点,即0,0,0。

示例:如果我们有一个由四个点P1,P2,P3,P4定义的形状,并且我们想要围绕P1施加旋转(矩阵M)和平移(向量V)。

  1. 您必须翻译每个点,以便P1成为原点。
  2. 在“左侧”应用矩阵M
  3. 重新转换点,使P1移至先前位置
  4. 应用翻译向量

公式1

当然,如果旋转中心是其他东西,例如Pc,它将是:

公式1

如果要取消先前的旋转(矩阵M1),并应用新的旋转(矩阵M2),则只需考虑以下几点:

公式2

关于您的代码:

要小心。 在大多数语言/图书馆中:

C = A.mulityplymatrix(B)

手段

公式2

可以不同于:

公式3

首先应用平移,然后进行旋转,将为您提供与先旋转后平移完全不同的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM