为什么我需要用 self.init() 初始化结构,即使我分配了所有属性?
Why do I need to initialize the struct with self.init() even if I assign all of the properties?
在 simd_float4x4
中,columns
是唯一的 属性,但是,这不会完全起作用,因为我没有调用 self.init()
。无论如何,一切都会被初始化。为什么编译器会抱怨?我在 this 视频中看到了类似的东西,它正在运行。为什么我做不到?
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 版本。您 link 从该视频中获得的代码也无法在 Swift 5.
中编译
与您的问题无关,但 Swift 中的变量名应该是小驼峰命名,因此 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}}};
}
在 simd_float4x4
中,columns
是唯一的 属性,但是,这不会完全起作用,因为我没有调用 self.init()
。无论如何,一切都会被初始化。为什么编译器会抱怨?我在 this 视频中看到了类似的东西,它正在运行。为什么我做不到?
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 版本。您 link 从该视频中获得的代码也无法在 Swift 5.
中编译与您的问题无关,但 Swift 中的变量名应该是小驼峰命名,因此 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}}};
}