如何将变换矩阵应用于 SceneKit 中的向量
How to apply a transformation matrix to a vector in SceneKit
我是不是漏掉了什么?在各种 vector/matrix 函数 here 中,我看不到任何简单地将 SCNMatrix4 变换应用于 SCNVector4 的函数。我当然可以通过手写 matrix/vector 乘法来做到这一点,但这肯定不需要吗?
这样做的原因是我分两步更新相机的投影变换。首先,我需要对原始变换应用一个变换,然后我需要将这个变换应用到一个向量以计算出一个数字,然后在该数字的基础上我需要在顶部应用进一步的变换。
由于调用 setProjectionTransform 似乎没有立竿见影的效果(我假设它发生在当前事务提交时),我无法调用 projectPoint 以在其中间状态应用转换。因此,我一直在研究构建转换矩阵并手动应用它。
这里肯定有一个函数可以完成你可能想用矩阵和向量做的最基本的事情???
在我看来,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)
}
}
我是不是漏掉了什么?在各种 vector/matrix 函数 here 中,我看不到任何简单地将 SCNMatrix4 变换应用于 SCNVector4 的函数。我当然可以通过手写 matrix/vector 乘法来做到这一点,但这肯定不需要吗?
这样做的原因是我分两步更新相机的投影变换。首先,我需要对原始变换应用一个变换,然后我需要将这个变换应用到一个向量以计算出一个数字,然后在该数字的基础上我需要在顶部应用进一步的变换。
由于调用 setProjectionTransform 似乎没有立竿见影的效果(我假设它发生在当前事务提交时),我无法调用 projectPoint 以在其中间状态应用转换。因此,我一直在研究构建转换矩阵并手动应用它。
这里肯定有一个函数可以完成你可能想用矩阵和向量做的最基本的事情???
在我看来,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)
}
}