在 camera-controls 源代码中,有一个视图偏移的示例。如何使用包装在“@react-three/drei”中的 CameraControls 来实现这个功能?
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;
}
示例来源:查看代码
现场演示:查看演示
更新:
@Łukasz-daniel-mastalerz 非常感谢!你的代码可以运行,但是有一个奇怪的着色问题MeshReflectorMaterial
。我复制了你的代码,并添加了更多对象:我的场景演示
如果我理解正确的话,您想要将逻辑从 vanilla 重写为Drei ...
offset
编辑
一般来说,这是一个自定义偏移的问题。你可以像原始示例一样
setViewOffset
“平移”场景。我根据你示例的参数重新创建了原始示例,结果也与原先一样:CodePen 上有原文
通过反复试验,我找到了一个使用monkey-patching 的解决方案,它可以消除伪影。对反射器进行 monkey-patching,使其自身的虚拟相机在绘制到反射之前始终清除所有视图偏移。
setViewOffset
改变相机视锥体,告诉 Three.js 只渲染完整视锥体的一部分,同样的方式也会影响使用该相机的所有对象。Reflector 会virtualCamera
复制你的相机……然后执行复制投影矩阵会包含视图偏移,而视图偏移通常位于镜像视图之外,从而拉伸反射纹理。这会导致上述瑕疵。
CodePen 上有
onBeforeRender
重写代码 R3F
顺便说一句,请记住“... R3F 反射器/MeshReflectorMaterial 与三的反射器不同...” - 您可能会很难重新创建代码 Vanilla → R3F 1-1...
点击此处查看更多
CODESANDBOX