反转沿 X 轴和 Y 轴的旋转,同时保持 Z 不变
Inverting the rotation along the X and the Y axis while keeping Z intact
我有一个simd_float4x4
矩阵,它是相机的变换矩阵。
在该矩阵中,我们有 tx
、ty
和 tz
,即翻译向量和 0x
、0y
、0z
、1x
、1y
、1z
、2x
、2y
和2z
,即旋转矩阵。
┌ ┐
| 0x 1x 2x tx |
| 0y 1y 2y ty |
| 0z 1z 2z tz |
| 0 0 0 1 |
└ ┘
当我在 3D 应用程序上测试旋转矩阵时,我发现沿 X 轴和 Y 轴的旋转是相反的,而沿 Z 轴的旋转是正确的。
因此,在 X 轴和 Y 轴上,真实相机顺时针旋转的任何旋转都显示为逆时针旋转。
我需要反转这些旋转。
请耐心等待,因为我的矩阵代数生疏了。
因此,轴的旋转矩阵如下图所示
如果我在正确的道路上,我需要将我的旋转矩阵乘以 Rx
和 Ry
,对吗?
如果我想反转 X
和 Y
中的旋转,我的 Rx
和 Ry
将等于:
┌ ┐
| 1 0 0 |
Rx = | 0 -1 0 |
| 0 0 -1 |
└ ┘
┌ ┐
| -1 0 0 |
Ry = | 0 1 0 |
| 0 0 -1 |
└ ┘
我可以将 Rx
和 Ry
相乘以获得我必须使用的最终矩阵:
┌ ┐
| -1 0 0 |
R = | 0 -1 0 |
| 0 0 1 |
└ ┘
所以,我所要做的就是将我的旋转矩阵乘以 R
以获得沿着 X
和 Y
的旋转,对吧?
不,最后的结果是一样的...唯一发生的事情是相机似乎在 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
}
}
我错过了什么?
我意识到我把这条线颠倒了。
let multiplication = matrix * inverse
正确的是
let multiplication = inverse * matrix
我有一个simd_float4x4
矩阵,它是相机的变换矩阵。
在该矩阵中,我们有 tx
、ty
和 tz
,即翻译向量和 0x
、0y
、0z
、1x
、1y
、1z
、2x
、2y
和2z
,即旋转矩阵。
┌ ┐
| 0x 1x 2x tx |
| 0y 1y 2y ty |
| 0z 1z 2z tz |
| 0 0 0 1 |
└ ┘
当我在 3D 应用程序上测试旋转矩阵时,我发现沿 X 轴和 Y 轴的旋转是相反的,而沿 Z 轴的旋转是正确的。
因此,在 X 轴和 Y 轴上,真实相机顺时针旋转的任何旋转都显示为逆时针旋转。
我需要反转这些旋转。
请耐心等待,因为我的矩阵代数生疏了。
因此,轴的旋转矩阵如下图所示
如果我在正确的道路上,我需要将我的旋转矩阵乘以 Rx
和 Ry
,对吗?
如果我想反转 X
和 Y
中的旋转,我的 Rx
和 Ry
将等于:
┌ ┐
| 1 0 0 |
Rx = | 0 -1 0 |
| 0 0 -1 |
└ ┘
┌ ┐
| -1 0 0 |
Ry = | 0 1 0 |
| 0 0 -1 |
└ ┘
我可以将 Rx
和 Ry
相乘以获得我必须使用的最终矩阵:
┌ ┐
| -1 0 0 |
R = | 0 -1 0 |
| 0 0 1 |
└ ┘
所以,我所要做的就是将我的旋转矩阵乘以 R
以获得沿着 X
和 Y
的旋转,对吧?
不,最后的结果是一样的...唯一发生的事情是相机似乎在 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
}
}
我错过了什么?
我意识到我把这条线颠倒了。
let multiplication = matrix * inverse
正确的是
let multiplication = inverse * matrix