Eu estou lendo um metal tutorial em raywenderlich.com, onde apresenta um flutuador Swift puro 4x4 classe ajudante. 99% é apenas envolver as funções do GLKit, exceto uma função que realmente me intriga:
static func makePerspectiveViewAngle(_ fovyRadians: Float, aspectRatio: Float, nearZ: Float, farZ: Float) -> float4x4 {
var q = unsafeBitCast(GLKMatrix4MakePerspective(fovyRadians, aspectRatio, nearZ, farZ), to: float4x4.self)
let zs = farZ / (nearZ - farZ)
q[2][2] = zs
q[3][2] = zs * nearZ
return q
}
Por que isso precisa mudar q[2][2]
e q[3][2]
. Existe alguma incompatibilidade entre o sistema de coordenadas do Metal e do GLKit?
Essa é uma escolha específica feita neste tutorial? Caso contrário, existem outras incompatibilidades entre o GLKit e a matemática do Metal?
Atualizar: Encontrei uma boa ilustração sobre o sistema de coordenadas de espaço de clipe do Metal na Sessão da WWDC 2016: Adotando o Metal I.
Respostas:
3 para resposta № 1Citando de esta pergunta no fórum
O OpenGL usa coordenadas diferentes de espaço de clipe queMetal (em GL, z vai de -1 a 1, enquanto no Metal z vai de 0 a 1), então usar GLKMatrix4MakePerspective não fornece uma matriz que adequadamente transforma do espaço dos olhos para o espaço do clipe. Em vez disso, transforma metade do volume de visualização atrás dos olhos, causando sutilezas questões de recorte e seleção. Você pode consertar a matriz que voltar GLK, definindo os elementos da matriz relevantes para a profundidade, adicionando o seguinte código ao makePerspectiveViewAngle:
Seja zs = farZ / (nearZ - farZ)
q [2] [2] = zs
q [3] [2] = zs * nearZ