ARSession
中模型座標轉換到Metal
的Shader
座標
vertex ColorInOut anchorGeometryVertexTransform(uint vid [[vertex_id]],
constant ParticleUniforms *particleUniforms [[buffer(0)]],
constant SharedUniforms &sharedUniforms [[buffer(kBufferIndexSharedUniforms)]]) {
const auto particleData = particleUniforms[vid];
float3 pos = particleData.position;
float4 position = float4(pos, 1.0);
float4x4 modelMatrix = particleData.modelMatrix;
float4x4 viewMatrix = sharedUniforms.viewMatrix;
float4x4 projectionMatrix = sharedUniforms.projectionMatrix;
float4 nePosition = projectionMatrix * viewMatrix * modelMatrix * position;
ColorInOut out;
out.position = nePosition;
out.pointSize = 10;
return out;
}
projectionMatrix * viewMatrix * modelMatrix * position
-
projectionMatrix
:matrix_float4x4
相機到投影3D
座標系轉換矩陣 -
viewMatrix
:matrix_float4x4
世界到相機視圖座標系轉換矩陣 -
modelMatrix
:matrix_float4x4
模型到世界座標系轉換矩陣 -
position
:float4
模型的本地空間座標
提示
modelMatrix * position
會得到模型的世界座標系,如果你的postion本來就是世界座標系,那就不用再 矩乘modelMatix
了。
1. projectionMatrix
frame.camera.projectionMatrix(for: .landscapeRight, viewportSize: viewportSize, zNear: 0.001, zFar: 0)
使用指定的參數返回適合渲染3D
內容以匹配相機捕獲的圖像的轉換矩陣。
此方法對
ARKit
無效,並且zNear
和zFar
參數與ARKit
相機狀態沒有關係。 取而代之的是,此方法使用這些參數以及相機的狀態來構造投影矩陣,以供您自己的渲染代碼使用。
2. viewMatrix
frame.camera.viewMatrix(for: .landscapeRight)
用於從世界空間轉換爲攝影機空間的轉換矩陣。
此方法對
ARKit
沒有影響。 取而代之的是,此方法使用orientation
參數和相機的狀態爲您自己的渲染代碼構造視圖矩陣。
3. modelMatrix
let anchor = frame.anchors.first
modelMatrix = anchor.transform
一個矩陣,該矩陣對錨點相對於放置該錨點的AR
會話的世界座標空間的位置、方向和比例進行編碼。
ARKit
中的世界座標空間始終遵循慣用右手
的慣例,但其方向基於會話配置。
如果需要轉成左手座標系
,可以這樣:
var coordinateSpaceTransform = matrix_identity_float4x4
coordinateSpaceTransform.columns.2.z = -1.0
let modelMatrix = simd_mul(anchor.transform, coordinateSpaceTransform)
4. position
模型的本地座標