问题描述
我想创建一个自定义 SKAction
以便能够围绕 x 和 y 轴旋转 SKNode
,所以我使用了一个 SKTransformNode
,它允许它的孩子在 3D 中旋转.围绕 x 或 y 轴旋转工作正常(使用 xRotate
和 yRotate
属性),但我希望能够同时围绕 x 和 y 轴旋转节点,为此我使用setRotationMatrix(matrix_float3x3)
方法。我计算旋转矩阵,将其传递给 setRotationMatrix
方法,这里是事情变得奇怪的地方:当我使用 SKTransformNode
方法向矩阵询问 rotationMatrix()
时,后面的行,我没有得到我刚刚设置的完全相同的矩阵。甚至有一个时刻 Rx 向量被重置,导致不良动画与间隙和沿 x 轴的重置,如这些图片所示:
Start -> Rotation's OK -> Rotation gets really wrong
这是设置和显示值的方法的一部分:
print("angle: \(angle)\tcos: \(c)\tsin: \(s)")
print("dRot matrix: \(dRot)")
node.setRotationMatrix(dRot)
print("node matrix: \(node.rotationMatrix())")
这里是直到 Rx 向量被重置的结果(不同的矩阵由 SpriteKit 计算给定动画的持续时间(此处为 0.05 秒)以达到 60fps):
angle: 0.0 cos: 1.0 sin: 0.0
dRot matrix: simd_float3x3([[1.0,0.0,0.0],[0.0,1.0,1.0]])
node matrix: simd_float3x3([[1.0,1.0]])
angle: 0.6962278 cos: 0.76726687 sin: 0.641328
dRot matrix: simd_float3x3([[0.88363343,0.320664],0.88363343,-0.320664],[-0.320664,0.320664,0.76726687]])
node matrix: simd_float3x3([[0.9418167,0.058183298,0.32066402],[0.058183298,0.9418167,-0.32066402],[-0.32066402,0.32066402,0.8836334]])
angle: 1.3957837 cos: 0.1741206 sin: 0.98472434
dRot matrix: simd_float3x3([[0.58706033,0.49236217],0.58706033,-0.49236217],[-0.49236217,0.49236217,0.1741206]])
node matrix: simd_float3x3([[0.79353017,0.20646983,[0.20646983,0.79353017,0.58706033]])
angle: 2.0849395 cos: -0.49178895 sin: 0.8707144
dRot matrix: simd_float3x3([[0.2541055,0.4353572],0.2541055,-0.4353572],[-0.4353572,0.4353572,-0.49178895]])
node matrix: simd_float3x3([[0.6270528,0.3729472,0.43535718],[0.3729472,0.6270528,-0.43535718],[-0.43535718,0.43535718,0.2541056]])
angle: 2.0954423 cos: -0.50090665 sin: 0.86550134
dRot matrix: simd_float3x3([[0.24954668,0.43275067],0.24954668,-0.43275067],[-0.43275067,0.43275067,-0.50090665]])
node matrix: simd_float3x3([[1.0,0.2495467,-0.43275064],0.43275064,0.2495467]])
如您所见,set 和 get 之间的值永远不会完全相同(除了开头),并且在最后一帧 Rx 向量变得非常错误:[1.0,0.0]
而不是 {{1} }!
你知道为什么我没有得到我刚刚设置的相同矩阵吗?最重要的是,为什么我最后得到了这个糟糕的值?
这里是完整的方法:
[0.24954668,0.43275067]
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)