Metal之矩阵转换
2021-03-25 本文已影响0人
loongod
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
模型的本地坐标