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

模型的本地座標

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