No código-fonte dos controles de câmera, há um exemplo de deslocamento de visualização. Como isso pode ser implementado usando os controles de câmera encapsulados em '@react-three/drei'?
let offsetUpdated = false;
const viewOffset = new THREE.Vector2();
const cameraControls = new CameraControls( camera, renderer.domElement );
cameraControls._truckInternal = ( deltaX, deltaY ) => {
viewOffset.x += deltaX;
viewOffset.y += deltaY;
camera.setViewOffset(
width,
height,
viewOffset.x,
viewOffset.y,
width,
height,
);
camera.updateProjectionMatrix();
offsetUpdated = true;
}
a fonte do exemplo: ver código
demonstração ao vivo: ver demonstração
atualizar:
@Łukasz-daniel-mastalerz Muito obrigado! Seu código funcionou, mas há um problema estranho de sombreamento MeshReflectorMaterial
. Fiz um fork do seu código e adicionei mais objetos: demonstração da minha cena
Se entendi corretamente, você quer reescrever a lógica 1-1,
offset
do vanilla para Drei...EDITAR
Em termos gerais, é uma questão de deslocamento personalizado. Você usa, como no exemplo original,
setViewOffset
para "Pan" a cena. Recriei o exemplo original nos parâmetros do seu exemplo e os artefatos também estão lá:CodePen com original
Por tentativa e erro, encontrei uma solução usando monkey-patching , que elimina artefatos. Aplicando monkey-patching no Refletor para que sua própria câmera virtual sempre limpe qualquer deslocamento de visão antes de se aproximar do reflexo.
setViewOffset
altera o tronco da câmera, diz ao Three.js para renderizar apenas uma sub-região do tronco completo, o que afeta tudo o que usa essa câmera. O ReflectorvirtualCamera
copia sua câmera... e então fazCopiar a matriz de projeção inclui o deslocamento da sua visão, que muitas vezes fica fora da visão espelhada, esticando assim a textura do reflexo. Isso cria esses artefatos.
CodePen com
onBeforeRender
Código R3F reescrito
A propósito, tenha em mente que "... R3F Reflector / MeshReflectorMaterial não é a mesma coisa que o Reflector do three ..." - você pode ter dificuldades para recriar o código Vanilla → R3F 1-1...
Veja mais AQUI
CODESANDBOX