Estou rodando meu próprio mecanismo 3D, em JavaScript, e usando apenas desenho de tela, sem WebGL. Este é outro clone do Minecraft; Eu amo caixas, não me julgue.
Até agora, tudo funciona maravilhosamente, exceto por uma coisa: em 3D, quando alguns vértices ficam atrás do plano de recorte próximo, sua projeção na tela fica estranha (supondo que outros vértices usados para rastrear um plano estejam na frente).
Tentei recortar esses pontos, mas depois vejo as superfícies que usam esses vértices. No WebGL / OpenGL, a placa gráfica cuida desses pontos e o avião é renderizado corretamente, mas como não tenho acesso ao hardware, devo codificar isso sozinho.
Não sei bem o que fazer, atualmente a última coisa que me veio à mente é reverter a projeção de pontos atrás do plano de recorte próximo do jogador, o que parece lógico, pois preciso projetar um ponto em uma tela à frente do vértice.
Aqui estão os meus pensamentos:
Aqui estão algumas imagens para ilustrar o que acontece:
De longe, a caixa azul se processa perfeitamente.
Quando alguns dos vértices ficam atrás do plano de recorte próximo do jogador, faço a projeção reversa, mas não parece correto:
focalLength *= -1;
2d.x = x*focalLength/z;
2d.y = y*focalLength/z;
Observe que a caixa cinza atrás é completamente removida, pois todos os vértices usados para desenhar suas faces estão atrás do jogador.
É o que acontece quando se olha para cima ou para baixo.
Não sei o que fazer com a matemática por trás disso, espero que alguém já tenha encontrado o mesmo problema e possa me ajudar.
lineTo(x,y)
função ainda pudesse ser chamada, só que eu não sei como ela se comporta ... é uma dimensão bizarra, eu concordo.