如何将变换矩阵应用于SceneKit中的向量

时间:2015-07-01 14:02:46

标签: scenekit

我在这里遗漏了什么吗?在各种矢量/矩阵函数a case-insensitive version中,我看不到任何简单地将SCNMatrix4变换应用于SCNVector4的函数。我当然可以通过写出矩阵/向量乘法来做到这一点,但肯定不需要吗?

这样做的原因是我分两步更新相机的投影变换。首先,我需要将一个变换应用于原始变换,然后我需要将此变换应用于向量以计算出一个数字,然后根据该数字我需要在顶部应用进一步的变换。

由于看起来调用setProjectionTransform没有立竿见影的效果(假设它在当前事务提交时发生),我无法调用projectPoint将转换应用于其中间状态。因此,我一直在寻找构建转换矩阵并手动应用它。

当然必须有一个函数来做一个你可能想要用矩阵和向量做的最基本的东西???

1 个答案:

答案 0 :(得分:5)

在我看来,Apple还没有时间将他们的Game Kit类型转换为simd,但是因为他们知道他们会这样做,所以他们没有提供你对Scene Kit的期望。现在,我认为正确的做法是让我们在初始化器的存储库上工作。所有工作都将使用simd类型完成;必要时会进行转换。

extension float4x4 {
    init(_ matrix: SCNMatrix4) {
        self.init([
            float4(matrix.m11, matrix.m12, matrix.m13, matrix.m14),
            float4(matrix.m21, matrix.m22, matrix.m23, matrix.m24),
            float4(matrix.m31, matrix.m32, matrix.m33, matrix.m34),
            float4(matrix.m41, matrix.m42, matrix.m43, matrix.m44)
        ])
    }
}

extension float4 {
    init(_ vector: SCNVector4) {
        self.init(vector.x, vector.y, vector.z, vector.w)
    }
}

extension SCNVector4 {
    init(_ vector: float4) {
        self.init(x: vector.x, y: vector.y, z: vector.z, w: vector.w)
    }
}