CubeCamera を使用して単純な反射モデルを作成します。セットアップは下の写真で見ることができます。
カメラが立方体に十分近い場合、反射はきれいに見えます。ただし、オブジェクトから離れると、反射が大きくなります。下の図を参照してください。
これは私が望む方法ではありません。反射が比例して小さくなるようにしたいと思います。さまざまな設定で遊んでみましたが、これは適切なシェーダー プログラム (立方体のテクスチャをつぶすだけ) を使用して実現できると考えたので、既存の PhongShader をいじってみましたが、うまくいきませんでした。私はこれにあまりにも初心者です。
また、の幅と高さを変更するとcubeCamera.renderTarget
、つまり
cubeCamera.renderTarget.width = cubeCamera.renderTarget.height = 150;
反射の適切な寸法を取得できますが、表面上の位置が間違っています。下の写真の角度から見ると見えますが、カメラをまっすぐにすると見えません。テクスチャを中央に配置する必要があるようです。
実際のコードは非常に単純です。
var cubeCamera = new THREE.CubeCamera(1, 520, 512);
cubeCamera.position.set(0, 1, 0);
cubeCamera.renderTarget.format = THREE.RGBAFormat;
scene.add(cubeCamera);
var reflectorObj = new THREE.Mesh(
new THREE.CubeGeometry(20, 20, 20),
new THREE.MeshPhongMaterial({
envMap: cubeCamera.renderTarget,
reflectivity: 0.3
})
);
reflectorObj.position.set(0, 0, 0);
scene.add(reflectorObj);
var reflectionObj = new THREE.Mesh(
new THREE.SphereGeometry(5),
new THREE.MeshBasicMaterial({
color: 0x00ff00
})
);
reflectionObj.position.set(0, -5, 20);
scene.add(reflectionObj);
function animate () {
reflectorObj.visible = false;
cubeCamera.updateCubeMap(renderer, scene);
reflectorObj.visible = true;
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
どんな助けにも感謝します!