【问题标题】:How to apply a transformation matrix to a vector in SceneKit如何将变换矩阵应用于 SceneKit 中的向量
【发布时间】:2015-07-01 23:13:45
【问题描述】:

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

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

由于调用 setProjectionTransform 似乎没有立即效果(我假设它发生在当前事务提交时),所以我不能调用 projectPoint 来应用中间状态的转换。因此,我一直在考虑构建转换矩阵并手动应用它。

这里肯定有一个函数来做你可能想做的对矩阵和向量做的最基本的事情???

【问题讨论】:

    标签: scenekit


    【解决方案1】:

    在我看来,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)
        }
    }
    

    【讨论】:

    • 有趣,谢谢 - 我会在早上试试这个
    • 抱歉,我没有尝试过,因为我找到了一种不同的方法来解决我的问题,完全避免了矩阵乘法。但是,我已经接受了这个答案,因为我看不出它不起作用的任何原因,而且它看起来确实方便快捷。
    猜你喜欢
    • 2018-11-05
    • 2015-04-23
    • 2011-01-07
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多