Three.js: plano de clipe definido pelo usuário

Criado em 13 out. 2011  ·  5Comentários  ·  Fonte: mrdoob/three.js

Eu gostaria de usar planos de recorte definidos pelo usuário.
Em openGL eu usaria:

glClipPlane(GL_CLIP_PLANE0, planeEq);
glEnable(GL_CLIP_PLANE0);

Como posso fazer o mesmo com o webGL?

Question

Comentários muito úteis

Ei, muito obrigado pessoal !!

Suas sugestões me fizeram reconsiderar o problema e percebi que não havia um atraso "geral", mas apenas piscando quando o plano do clipe próximo muda (a posição do espelho em comparação com a posição da câmera espelhada).

Então, você estava quase lá @ WestLangley : são as matrizes da câmera espelhada que você precisa atualizar, não a própria câmera.

Resultado: chega de 'lag': http://jsfiddle.net/slayvin/PT32b/2/ : smiley:

Talvez possamos abstrair isso em seu próprio objeto.

Sim, já pensei nisso. Seria ótimo ter um new THREE.mirror() que cuidasse de tudo. Vou tentar codificar algo ...

Todos 5 comentários

Você deve conseguir obter o contexto WebGL com renderer.context .
A partir daí, depende de você e da especificação WebGL :)

Recentemente, encontrei o mesmo problema ao implementar superfícies planas reflexivas (também conhecidas como 'espelhos': sorriso:) em three.js
Até onde eu sei, você não pode ter planos de recorte definidos pelo usuário com WebGL, pelo menos não com a maneira 'simples' de openGL que você descreveu.
O truque é usar o método "Oblique View Frustum", que é explicado neste artigo: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
O objetivo deste método é substituir o plano do clipe próximo do tronco da câmera espelhada pelo plano definido pela superfície reflexiva.
Existe até algum código-fonte fornecido (embora em C ++): http://www.terathon.com/code/oblique.html

Portei com sucesso esse método em three.js e aqui está um exemplo de cena para mostrar isso ao vivo: http://jsfiddle.net/slayvin/PT32b/

O único problema restante é que o renderTarget é renderizado um quadro atrás, e eu não tenho ideia do porquê! Isso causa cintilação quando a câmera se move muito rápido e quando o espelho está passando por outros objetos.

Alguma ideia de como consertar isso? Eu preciso implementar um tipo de método de multi-buffering, ou é simplesmente porque eu não atualizei a matriz da câmera após modificar o frustum? Se sim, como posso fazer isso?

Mmmhh ... Eu tentei definir scene.autoUpdate para false e chamar scene.updateMatrixWorld() manualmente para ter certeza de que todos os renderizadores tinham as mesmas coisas, mas não parecem resolver nada ... Nenhum chamando mirror.updateMatrix() antes de extrair a rotação de lá ...

Muito legal! Talvez possamos abstrair isso em seu próprio objeto.

Doce.

Também tentei ter certeza de que as matrizes relevantes eram atuais. Se você está preocupado com o lag, deve atualizá-los antes de usá-los. Infelizmente, não pareceu importar ao fazer zoom rapidamente ...

mirror.updateMatrixWorld();

camera.updateMatrixWorld();

camera.matrixWorldInverse.getInverse( camera.matrixWorld );

Ei, muito obrigado pessoal !!

Suas sugestões me fizeram reconsiderar o problema e percebi que não havia um atraso "geral", mas apenas piscando quando o plano do clipe próximo muda (a posição do espelho em comparação com a posição da câmera espelhada).

Então, você estava quase lá @ WestLangley : são as matrizes da câmera espelhada que você precisa atualizar, não a própria câmera.

Resultado: chega de 'lag': http://jsfiddle.net/slayvin/PT32b/2/ : smiley:

Talvez possamos abstrair isso em seu próprio objeto.

Sim, já pensei nisso. Seria ótimo ter um new THREE.mirror() que cuidasse de tudo. Vou tentar codificar algo ...

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

Questões relacionadas

jlaquinte picture jlaquinte  ·  3Comentários

fuzihaofzh picture fuzihaofzh  ·  3Comentários

danieljack picture danieljack  ·  3Comentários

konijn picture konijn  ·  3Comentários

seep picture seep  ·  3Comentários