【问题标题】:Inverting the rotation along the X and the Y axis while keeping Z intact沿 X 和 Y 轴反转旋转,同时保持 Z 不变
【发布时间】:2020-10-04 09:17:56
【问题描述】:

我有一个simd_float4x4 矩阵,它是相机的变换矩阵。

在该矩阵中,我们有txtytz(即平移向量)和0x0y0z1x1y1z2x2y2z,就是旋转矩阵。

┌                  ┐
|  0x  1x  2x  tx  |
|  0y  1y  2y  ty  |
|  0z  1z  2z  tz  |
|  0   0   0   1   |
└                  ┘

当我在 3D 应用程序上测试旋转矩阵时,我看到沿 X 轴和 Y 轴的旋转是反转的,而沿 Z 轴的旋转是正确的。

因此,在 X 轴和 Y 轴上,真实相机顺时针进行的任何旋转都会显示为逆时针。

我需要反转这些旋转。

请耐心等待,因为我的矩阵代数已经生锈了。

因此,轴的旋转矩阵如下图this SO answer所述

如果我在正确的道路上,我需要将我的旋转矩阵乘以 RxRy,对吧?

如果我想反转XY 中的旋转,我的RxRy 将等于:

     ┌             ┐
     |  1   0   0  |
Rx = |  0  -1   0  |
     |  0   0  -1  |
     └             ┘

     ┌             ┐
     |  -1  0   0  |
Ry = |   0  1   0  |
     |   0  0  -1  |
     └             ┘

我可以将RxRy 相乘以获得我必须使用的最终矩阵:

    ┌              ┐
    |  -1   0   0  |
R = |   0  -1   0  |
    |   0   0   1  |
    └              ┘

所以,我所要做的就是将我的旋转矩阵乘以 R 以使旋转沿 XY 反转,对吧?

不,最终结果是一样的……唯一发生的事情是相机似乎在 Y 轴上旋转了。

我正在使用此代码

import simd

extension simd_float4x4 {

  var rotatedXY: simd_float4x4 {

    let c0 = SIMD3<Float>(-1.0, 0.0, 0.0)
    let c1 = SIMD3<Float>(0.0, -1.0, 0.0)
    let c2 = SIMD3<Float>(0.0,  0.0, 1.0)
    let inverse = simd_float3x3(c0,c1,c2)

    let cx0 = SIMD3<Float>(columns.0.x, columns.0.y, columns.0.z)
    let cx1 = SIMD3<Float>(columns.1.x, columns.1.y, columns.1.z)
    let cx2 = SIMD3<Float>(columns.2.x, columns.2.y, columns.2.z)
    let matrix = simd_float3x3(cx0,cx1,cx2)

    let multiplication = matrix * inverse

    var resultado = self

    resultado.columns.0.x = multiplication.columns.0.x
    resultado.columns.0.y = multiplication.columns.0.y
    resultado.columns.0.z = multiplication.columns.0.z

    resultado.columns.1.x = multiplication.columns.1.x
    resultado.columns.1.y = multiplication.columns.1.y
    resultado.columns.1.z = multiplication.columns.1.z

    resultado.columns.2.x = multiplication.columns.2.x
    resultado.columns.2.y = multiplication.columns.2.y
    resultado.columns.2.z = multiplication.columns.2.z

    return resultado
  }
}

我错过了什么?

【问题讨论】:

    标签: swift matrix simd rotational-matrices transformation-matrix


    【解决方案1】:

    我意识到我把这条线颠倒了。

    let multiplication = matrix * inverse
    

    正确的是

    let multiplication = inverse * matrix
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2018-11-04
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多