1

私はwebglでボリュームレンダリングアプリを開発しています。最後にやらなければならないことは、照明モデルを作成することです。すべての準備ができていますが、シーンのライトポジションを取得できません。私はこのように光を追加しています:

 var light = new THREE.DirectionalLight(0xFFFFFF, 1);
 light.position.set(0.5, 0.5, 0.1).normalize();
 camera.add(light);

カメラを持って移動する場合はライトを静止させる必要があるため、カメラにライトを取り付けます。問題は、ShaderMaterial(カスタムシェーダー)を使用していることです。光の位置を表す均一な変数を見つけることができません。私は検索しました、それを設定する必要があります:

material.lights = true;

しかし、それはエラーを引き起こしました。

Uncaught TypeError: Cannot set property 'value' of undefined 

頂点シェーダーに定数ベクトルを追加しようとしましたが、逆ビュー行列を乗算する必要があります(正しい場合)。ただし、GLSL1.0は関数をサポートしていません。ユニフォームで逆ビューマトリックスをシェーダーに送信することを考えていますが、JSでシーンのビューマトリックスをどこで取得できるかわかりません。

手伝ってくれてありがとう。私はすべてを試しました:(..。

さよなら。

4

2 に答える 2

2

カメラの子としてライトを追加して設定material.lights = trueする場合は、シーンの子としてカメラを追加する必要があります。

scene.add( camera );

three.js r.57

于 2013-03-27T14:32:47.610 に答える
1

カメラを使用してモデル空間から画面空間に光の座標を投影しようとしている場合は、次の機能が役立ちます(Thibaut Despoulain提供)-

var projectOnScreen = function(object, camera)
{
var mat = new THREE.Matrix4();
mat.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld);
mat.multiplyMatrices( camera.projectionMatrix , mat);

var c = mat.n44;
var lPos = new THREE.Vector3(mat.n14/c, mat.n24/c, mat.n34/c);
lPos.multiplyScalar(0.5);
lPos.addScalar(0.5);
return lPos;
}
于 2014-04-16T00:03:43.997 に答える