8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Three.jsのdirctionalLightの影を最適化する

Last updated at Posted at 2020-05-21

影の入れ方の最適化を確認します。

基礎~応用まで

影いれんの最初めんどくさい

Three.jsで影を作る場合、

###プロパティを設定

qiita.js
obj.castShadow = true;

を物体に設定

qiita.js
obj.receiveShadow= true;

を床に設定します。

で、出るかなと思ったら、出ない:rage:

###ライトに設定
ライトにも影を出す設定をする必要があるらしい。
いれてないリファレンスはふぁっく:angel_tone1:

qiita.js
directionalLight.castShadow = true;

で出ない:rage:

###レンダラーに設定
レンダラーにも影を出す設定をする必要があるらしい。
いれてないリファレンスはふぁっく:angel_tone1:

qiita.js
renderer.shadowMap.enabled = true;

で、人によって出る:kiss_mm:
もしくは出ない:rage:
出ても影がおかしい:rage:

###影が出る範囲を設定する

出る範囲がデフォルトで小さい場合があるので、大きくしよう

qiita.js
directionalLight.shadow.camera.right = 12;
directionalLight.shadow.camera.left = -12;
directionalLight.shadow.camera.top = -12;
directionalLight.shadow.camera.bottom = 12;

で、(0,0,0)を中心に24*24の矩形の範囲の影ができる:heart_eyes:

###影の解像度を調整
mapサイズを設定すると影がくっきり出たりするらしい。

qiita.js
directionalLight.shadow.mapSize.width = 512;
directionalLight.shadow.mapSize.height = 512;

大きくするとくっきりした影になる。8192くらいにすると綺麗なんだけど、重くなる。2048が限度くらいの認識512に抑えれると嬉しい:heart_eyes:

##本題:影の最適化をする

・影が出る範囲を大きくすればするほど、解像度は小さくなる。
・影が出る範囲を小さくすればするほど、解像度は大きくさくなる。
つまり影が出るエリアをカメラが映してる方向に限定したい。

###確認する為にはHelperを出す。

qiita.js
var directionalLightShadowHelper = new THREE.CameraHelper(Data.directionalLight.shadow.camera);
scene.add( directionalLightShadowHelper);
var directionalLightHelper = new THREE.DirectionalLightHelper( Data.directionalLight);
scene.add( directionalLightHelper);

と黄色と赤い枠みたいので照明が当たってるエリアが分かる。

影が出る範囲を

qiita.js
directionalLight.shadow.camera.right = 12+100;
directionalLight.shadow.camera.left = -12+100;

みたいにすると移動しそうだ。やる。
移動しない:rage:
left rightの意味はほぼない。普通に0を中心に動くだけ:rage:

ヘルパーを見てると中心地に向けて照明はあたり中心地に影ができ続けてる。

###照明のターゲットが存在する
照明にターゲットのパラメーターが存在している。

qiita.js
directionalLight.position.set( 300, 300, 300 );
directionalLight.target.position.set( 300, 0, 300 );

※x:300 z:300から真下(Y)に向けてdhirectionLightを当てるような設定のはず
これで照明を当てるエリアを設定できそうだ。設定。
移動しない:rage:

公式のリファレンスを見る。

Note: For the target's position to be changed to anything other than the default, it must be added to the scene using

google 翻訳

注:ターゲットの位置をデフォルト以外の位置に変更するには、次のコマンドを使用してシーンに追加する必要があります

qiita.js
scene.add( directionalLight.target );

ついに好きな位置に影のターゲットを移動できた:heart_eyes:
これでカメラが向いた方向のみに高画質な影が存在する設定ができる:heart_eyes:

ライトに設定されてるtargetを更に追加しないと変化しないとかが意味不明な感じでしたが、
なんとか実装をする事ができました。

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?