Skybox Cube / 環境マッピングを使用して、素敵な金属とガラスのようなマテリアルを作成することができました。
FirstPersonControls のように周回と移動/見回すことができる独自のコントロールを作成しました。
問題は、動き回ると反射が説得力のあるものに見えることです。カメラの動きに応じて反射が移動し、変化するのがわかります。しかし、私が周りを見回しても(カメラを回転させたり、ターゲットを変更したり)、反射に変化はなく、静的です。
たとえば、three.js/examples/webgl_materials_cubemap_escher.html で同じ動作を確認できます。FirstPersonControls を使用するように変更すると、周りを見てもマテリアルはまったく反射/屈折していないように見えます。
キューブマップのセットアップ方法は次のとおりです。正直なところ、いくつかの例からコピーしたものであり、すべてを理解することはできません。しかし、この1つの問題を除いて機能します...
createSkyBox = function(urlPrefix) {
var sceneCube = new THREE.Scene();
var path = urlPrefix;
var format = '.jpg';
var urls = [
path + 'px' + format, path + 'nx' + format,
path + 'py' + format, path + 'ny' + format,
path + 'pz' + format, path + 'nz' + format
];
var reflectionCube = THREE.ImageUtils.loadTextureCube( urls );
reflectionCube.format = THREE.RGBFormat;
var refractionCube = new THREE.Texture( reflectionCube.image, new THREE.CubeRefractionMapping() );
refractionCube.format = THREE.RGBFormat;
// Skybox
var shader = THREE.ShaderUtils.lib[ "cube" ];
shader.uniforms[ "tCube" ].value = reflectionCube;
var material = new THREE.ShaderMaterial( {
fragmentShader: shader.fragmentShader,
vertexShader: shader.vertexShader,
uniforms: shader.uniforms,
depthWrite: false,
side: THREE.BackSide
} );
var size = 8000;
mesh = new THREE.Mesh( new THREE.CubeGeometry( size, size, size ), material );
mesh.geometry.computeBoundingBox();
sceneCube.add( mesh );
this._threejs_cube_scene = sceneCube;
this._threejs_cube_mesh = mesh;
this._threejs_envmap = reflectionCube;
this._threejs_envmap_refraction = refractionCube;
this._threejs_scene.add( sceneCube );
}
そして、これが私がマテリアルを作成する方法です:
var material = new THREE.MeshLambertMaterial( { color: 0xff00, ambient: 0xaaaaaa, envMap: this._threejs_envmap});
次に、renderer.overrideMaterial でマテリアルを使用します (違いがあれば、EffectComposer を使用しています)。
編集:今考えてみると、よくわかりません..私の脳が溶けます..それが実際の生活の仕組みかもしれません:)気分がいい。しかし、実際には少しも動かさずに (eye.lookAt()) 周りを見回すのは難しい (eye.position = xyz) ためかもしれません。