Ios 如何使用4x4矩阵变换或euler角度旋转三维向量?
我有一个3d向量,我正在应用它作为物理力:Ios 如何使用4x4矩阵变换或euler角度旋转三维向量?,ios,matrix,graphics,3d,scenekit,Ios,Matrix,Graphics,3d,Scenekit,我有一个3d向量,我正在应用它作为物理力: let force = SCNVector3(x: 0, y: 0, z: -5) node.physicsBody?.applyForce(force, asImpulse: true) 我需要根据我可用的4x4矩阵变换或euler角度旋转力 var变换:矩阵_float4x4-摄影机在世界坐标空间中的位置和方向 var eulerAngles:vector_float3-摄影机的方向,表示为滚动、俯仰和偏航值 我认为这更像是一个基本的3d图形
let force = SCNVector3(x: 0, y: 0, z: -5)
node.physicsBody?.applyForce(force, asImpulse: true)
我需要根据我可用的4x4矩阵变换或euler角度旋转力
var变换:矩阵_float4x4-摄影机在世界坐标空间中的位置和方向
var eulerAngles:vector_float3-摄影机的方向,表示为滚动、俯仰和偏航值
我认为这更像是一个基本的3d图形问题,但它的应用程序是一个基于Swift的iOS应用程序,使用SceneKit和ARKit
在和simd库中有一些实用程序可供我使用。不幸的是,我天真的尝试去做一些事情,比如
simd\u mul(force,currentFrame.camera.transform)
让我失败了 你的想法是对的。需要将变换和方向相乘。
我在simd\u mul
上找不到任何文档。但我怀疑您至少有以下问题之一:
simd_mul
应用变换的旋转和平移extension SCNMatrix4 {
static public func *(left: SCNMatrix4, right: SCNVector4) -> SCNVector4 {
let x = left.m11*right.x + left.m21*right.y + left.m31*right.z + left.m41*right.w
let y = left.m12*right.x + left.m22*right.y + left.m32*right.z + left.m42*right.w
let z = left.m13*right.x + left.m23*right.y + left.m33*right.z + left.m43*right.w
let w = left.m14*right.x + left.m24*right.y + left.m43*right.z + left.m44*right.w
return SCNVector4(x: x, y: y, z: z, w: w)
}
}
extension SCNVector4 {
public func to3() -> SCNVector3 {
return SCNVector3(self.x , self.y, self.z)
}
}
现在请执行以下操作:
@orangenkopf提供了一个帮助我得出以下结论:
let force = simd_make_float4(0, 0, -5, 0)
let rotatedForce = simd_mul(currentFrame.camera.transform, force)
let vectorForce = SCNVector3(x:rotatedForce.x, y:rotatedForce.y, z:rotatedForce.z)
node.physicsBody?.applyForce(vectorForce, asImpulse: true)
这对我帮助很大!我必须在
simd\u make\u float4
调用中切换本地方向的X&Y值
let force = simd_make_float4(0, 0, -5, 0)
let rotatedForce = simd_mul(currentFrame.camera.transform, force)
let vectorForce = SCNVector3(x:rotatedForce.x, y:rotatedForce.y, z:rotatedForce.z)
node.physicsBody?.applyForce(vectorForce, asImpulse: true)