为什么我需要用self.init()初始化结构,即使我分配了所有属性



simd_float4x4中,columns是唯一的属性,但这并不能完全起作用,因为我没有调用self.init()。无论如何,一切都会被初始化。编译器为什么抱怨?我在这段视频中看到了类似的东西,它正在发挥作用。为什么我做不到?

extension simd_float4x4 {
init(ProjectionFrame: CGSize) {
let Y = FOV(), FarZ = Float((Settings.VisibilityRange+1)*2), Z = FarZ / (NearZ - FarZ)
columns = (vector_float4(Y / Float(ProjectionFrame.width / ProjectionFrame.height), 0, 0, 0), vector_float4(0, Y, 0, 0), vector_float4(0, 0, Z, -1), vector_float4(0, 0, Z * NearZ, 0))
}
}

在视频中我注意到了这一点。

extension simd_float4x4 {
init(translationX x: Float, x: Float, x: Float) {
columns = (
vector_float4(x, 0, 0, 0),
vector_float4(0, x, 0, 0),
vector_float4(0, 0, x, 0),
vector_float4(0, 0, 0, 1)
)
}
}

编译器没有抱怨。为什么它在为我抱怨?

与其尝试从init设置columns,不如只调用self.init(_ columns:)并将4个vector_float4作为Array而不是tuple传入。

extension simd_float4x4 {
init(ProjectionFrame: CGSize) {
let Y = FOV(), FarZ = Float((Settings.VisibilityRange+1)*2), Z = FarZ / (NearZ - FarZ)
self.init([vector_float4(Y / Float(ProjectionFrame.width / ProjectionFrame.height), 0, 0, 0), vector_float4(0, Y, 0, 0), vector_float4(0, 0, Z, -1), vector_float4(0, 0, Z * NearZ, 0)])
}
}

该视频已有2年历史,因此使用了Swift的旧版本。你从视频中链接的代码也没有在Swift 5中编译。

与您的问题无关,但Swift中的变量名应该是lowerCamelCase,因此projectionFrame是正确的命名。

或者我可以将其桥接到C

#include <simd/simd.h>
matrix_float4x4 ProjectPerspective(const float Ratio) {
const float Y = 1/tanf(Rad(Settings.FOV+15)), FarZ = (Settings.VisibilityRange+1)*32, Z = FarZ/(NearZ-FarZ);
return (matrix_float4x4){.columns = {{Y/Ratio, 0, 0, 0}, {0, Y, 0, 0}, {0, 0, Z, -1}, {0, 0, Z*NearZ, 0}}};
}

最新更新