Three.js: Artefatos de exemplo de espelho WebGL

Criado em 17 ago. 2017  ·  5Comentários  ·  Fonte: mrdoob/three.js

Os artefatos podem ser reproduzidos ampliando e movendo um pouco a câmera.

https://threejs.org/examples/webgl_mirror.html

screen shot 2017-08-16 at 8 53 26 pm

Versão Three.js
  • [x] Dev
  • [x] r86
Navegador
  • [x] Chrome
SO
  • [x] macOS
Bug

Comentários muito úteis

@mrdoob Se você ainda está brincando, acho que há espaço para simplificação ...

//mirrorCamera.up.set( 0, - 1, 0 );
//mirrorCamera.up.applyMatrix4( rotationMatrix );
//mirrorCamera.up.reflect( normal ).negate();

mirrorCamera.up.set( 0, 1, 0 ).applyMatrix4( rotationMatrix ).reflect( normal );

Todos 5 comentários

De fato.
Veja também este tópico: https://github.com/mrdoob/three.js/issues/11885
No final, tenho a sensação de que o Mirror não está devidamente implementado.

A proporção da câmera principal nunca é copiada para a câmera espelho.

// "examples/Mirror.js" (lines 142-146)
mirrorCamera.near = camera.near;
mirrorCamera.far = camera.far;
mirrorCamera.updateMatrixWorld();
mirrorCamera.updateProjectionMatrix();

Deve ser alterado para:

mirrorCamera.updateMatrixWorld();
mirrorCamera.projectionMatrix.copy(camera.projectionMatrix);

Vou enviar um PR para isso mais tarde!

Outro problema com o espelho (e o oceano plano) é que ele parece não funcionar quando logarithmicDepthBuffer está habilitado. O recorte oblíquo próximo ao plano atrapalha a profundidade e nunca encontrei uma solução para isso. Eu gostaria que o WebGL tivesse glClipPlane 😞

@vanruesc Eu estava bagunçando o código, então implementei diretamente. Muito Obrigado!

@mrdoob Se você ainda está brincando, acho que há espaço para simplificação ...

//mirrorCamera.up.set( 0, - 1, 0 );
//mirrorCamera.up.applyMatrix4( rotationMatrix );
//mirrorCamera.up.reflect( normal ).negate();

mirrorCamera.up.set( 0, 1, 0 ).applyMatrix4( rotationMatrix ).reflect( normal );

@WestLangley Obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações