Metal之矩阵转换

ARSession中模型座标转换到MetalShader座标

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无效,并且zNearzFar参数与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

模型的本地座标

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章