Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用4x4矩阵变换或euler角度旋转三维向量?_Ios_Matrix_Graphics_3d_Scenekit - Fatal编程技术网

Ios 如何使用4x4矩阵变换或euler角度旋转三维向量?

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图形

我有一个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
    应用变换的旋转和平移
  • 摄影机的变换位于世界坐标空间中。根据您的节点层次结构,这可能导致方向偏离
  • SceneKit没有提供太多线性代数函数,因此我们必须构建自己的:

    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)
        }
    }
    
    现在请执行以下操作:

  • 将摄影机变换转换为节点局部坐标系
  • 将力创建为4d向量,将第四个元素设置为0以忽略平移
  • 将变换和向量相乘

  • @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)