0

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) ためかもしれません。

4

2 に答える 2

1

ワールド空間で反射ベクトルを計算する必要があります (ここには表示されていない「fragmentShader」のコード内)。オブジェクト空間、またはビュー (カメラ) 空間にある場合、自然に動きません。

はい、これは表面の法線に若干の変更が加えられていることを意味している可能性があります。オブジェクト空間法線をワールド空間法線に変換するには、ワールド行列の逆転置を使用します。また、最終的なワールド空間反射ベクトルを計算するために、ワールド空間座標でビュー ベクトルを取得する必要があります。

于 2012-12-03T22:55:09.383 に答える
0

シェーダーを変更するより簡単なもう 1 つの考慮事項は、カメラを人間の頭のように回転させたい場合に、カメラにオフセットを与えることです。これを Object3d に追加し、Object3d の位置から少し (人間の中心から目までの距離に相当する量) オフセットするように設定してから、カメラの代わりに Object3d を回転させます。

単に眼球を向けただけでは反射が変わらないため、説明からどのような効果が必要かを判断するのはちょっと難しいです。それを変えるのは頭のわずかな傾きです。

于 2013-06-22T12:47:29.753 に答える