【第2部】
ライティングとシェーディング

  • 1. シェーディングの基本
  • 2. 反射材質モデル
  • 3. 様々な光源によるライティング
  • 4. シャドーイングの基本

シェーディングとは?

「シェーディング」とは日本語で「陰影づけ」の意味

人目に映る物体の質感 = 反射光

シェーディングに必要な要素

①反射材質」と「②光源」の2つの要素で決定!

①反射材質の用意

TrackBallControls.html」に変更を加えていきます! 材質オブジェクトを「ランバート反射材質」に置き換えます

 //ランバート反射材質の準備
						var material = new THREE.MeshLambertMaterial({ color: 0xFF0000 });
				

シェーディングに必要な要素

②光源の用意

オブジェクト初期化関数に平行光源オブジェクトを用意。

//平行光源オブジェクトの生成
directionalLight = new THREE.DirectionalLight(0xFFFFFF, 1.0);
//平行光源オブジェクトの位置の設定
directionalLight.position.set(100, 100, 100);
//平行光源オブジェクトのシーンへの追加
scene.add(directionalLight);
				

平行光源とは?

光線ベクトル(光源から発せられる光の向き)が
空間内の位置に依らず一定となる光源

平行光源を特徴付けるパラメータ

シェーディングのまとめ

  • 仮想3次元空間内のオブジェクトに立体感与えるのに有効な手法。
  • コンピュータ・グラフィックスで最も一般的なシェーディング手法は、反射材質光源によって陰影を数学的に計算。
  • three.jsでは、反射材質としてランバート反射材質フォン反射材質が定義されている(後述)。
  • three.jsでは、光源として平行光源点光源スポットライト光源半球光源が定義されている(後述)。
  • 描画色は光源色材質色で決定される(後述)。
  • 1. シェーディングの基本
  • 2. 反射材質モデル
  • 3. 様々な光源によるライティング
  • 4. シャドーイングの基本

反射材質モデルとは?

光線ベクトル法線ベクトルの関係性で
描画色が決定される材質(数理モデル)

必ず法線ベクトルを与える必要がある!

ランバート反射材質とは?

光線ベクトル法線ベクトルの関係性だけ
描画色が決定される材質

カメラの位置には依存しない!→ マッドな感じ

光沢感:フォン反射材質

光線ベクトルカメラの位置ベクトルの関係性で
光沢感(鏡面色)も描画される材質

フォン反射材質はランバート反射材質の拡張版!

フォン反射材質によるシェーディング

材質オブジェクトの変更

					//フォン反射材質の準備
					var material = new THREE.MeshPhongMaterial({
						color:0xFF0000,	//拡散色
						specular: 0xFFFFFF, //鏡面色
						shininess: 200		//鏡面指数
					});	
				

描画色が決定される材質の色積算

光源色を変更

					//平行光源オブジェクトの生成
					directionalLight = new THREE.DirectionalLight(0x00FFFF, 1.0); //<--------赤成分を無くす
				

描画色 = 材質の拡散色×光源色 + 材質の鏡面色×光源色

反射材質モデルのまとめ

  • 反射材質モデルとは、仮想3次元空間内のオブジェクトに陰影を与える数学的モデル。モデルの与え方で様々な質感を与えることができる。
  • 反射材質モデルでは、3次元オブジェクトを構成するポリゴンの位置ベクトル法線ベクトル、そして光線ベクトルなどのベクトル量が主要な役割を演じる。
  • ランバート反射材質は低負荷(計算量が少ない)で陰影を計算できるため、コンピュータ・グラフィックスで最もよく利用される。
  • フォン反射材質は、光沢感を出すことのできるモデルとして非常によく利用される。ランバート反射材質の拡張版で計算量が倍程度となる。
  • 1. シェーディングの基本
  • 2. 反射材質モデル
  • 3. 様々な光源によるライティング
  • 4. シャドーイングの基本

1.環境光源

存在する全ての物体を全方位から照らす光源(架空の光源)

環境光源を特徴付けるパラメータ

太陽光による物体の影が真っ暗でない理由がこれ!

環境光源の追加

オブジェクト初期化関数へ追記

					//環境光オブジェクトの生成
					ambientLight = new THREE.AmbientLight(0x555555);
					//環境光オブジェクトのシーンへの追加
					scene.add(ambientLight);
				

※全体的に白っぽくなってしまいました

材質に環境色の追加

オブジェクト初期化関数へ追記

					//フォン反射材質の準備
					var material = new THREE.MeshPhongMaterial({
						color:0xFF0000,		//拡散色
						ambient: 0x550000,	//環境色	<-------------追記
						specular: 0xFFFFFF, //鏡面色
						shininess: 200			//鏡面指数
					});
					

2.点光源

全方位に光を発することのできる光源

点光源を特徴付けるパラメータ

点光源の効果をわかりやすくするため、平面オブジェクトの準備も行います。

平面オブジェクトの準備

形状オブジェクトの変更

					//形状オブジェクトの宣言と生成
					var geometry = new THREE.PlaneGeometry(200, 200);
				

点光源の準備

光源オブジェクトの変更

					//点光源オブジェクトの生成
					pointLight = new THREE.PointLight(0xFFFFFF, 1.0);
					//点光源オブジェクトの位置の設定
					pointLight.position.set(0, 0, 20);
					//点光源オオブジェクトのシーンへの追加
					scene.add(pointLight);
					

点光源を回転

無限ループ関数の変更

					//ステップ数のインクリメント
					step++;	
					var x = 50 * Math.cos(Math.PI * step / 60);
					var y = 50 * Math.sin(Math.PI * step / 60);
					pointLight.position.set(x, y, 20);
					

3.スポットライト光源

3次元空間中の1点を中心に光を当てる光源

スポットライト光源を特徴付けるパラメータ

スポットライト光源の準備

光源オブジェクトの変更

					//スポットライト光源オブジェクトの生成 コンストラクタの引数(hex,intensity,destance,angle,exponent)
					spotLight = new THREE.SpotLight( 0xFFFFFF, 1.0, 0.0, Math.PI/6, 30 );
					//スポットライトオブジェクトの位置の設定
					spotLight.position.set(0, 0, 100);
					//スポットライトオブジェクトのシーンへの追加
					scene.add(spotLight);
				

トーラスオブジェクトの追加

 //形状オブジェクトの宣言と生成
var geometry = new THREE.TorusGeometry(20, 5, 50, 50); //トーラスの半径、管の半径、トーラスの分割数、管の分割数
//材質オブジェクトの宣言と生成
var material = new THREE.MeshLambertMaterial({color:0xFFE98D});
//トーラスオブジェクトの生成
torus = new THREE.Mesh(geometry, material);
//トーラスオブジェクトのシーンへの追加
scene.add(torus);
//トーラスオブジェクトの位置座標の指定
torus.position.set(0,0,30);

ライティングのまとめ

  • コンピュータ・グラフィックスにて光源は、反射材質モデルで陰影を計算するために必要な光線ベクトルを与える。
  • three.jsでは、光源として平行光源点光源スポットライト光源半球光源が定義されている。
  • 複数の光源を同時に利用することも可能。
  • 環境光源は、単独利用ではなく他の光源の補佐的な役割を果たす。
  • 1. シェーディングの基本
  • 2. 反射材質モデル
  • 3. 様々な光源によるライティング
  • 4. シャドーイングの基本

シャドーイングの必要性

Q.次の2つの立方体画像を見て、位置関係を答えてください

同じように見えます

シャドーイングの必要性

それぞれに影を追加します。

これで位置関係がわかると思います

シャドーイングの方法

シャドーマッピングの有効化を設定

シャドーイングの実装

// (1) レンダラーオブジェクト
renderer.shadowMapEnabled = true;
// (2) 光源オブジェクト
spotLight.castShadow = true;
// (3) 影生成元のオブジェクト
torus.castShadow = true;
// (4) 影描画オブジェクト
plane.receiveShadow = true;

影の高精密化と暗さ

	//シャドーマップのサイズ
spotLight.shadowMapWidth = 2048;	//デフォルト値 512
spotLight.shadowMapHeight = 2048; //デフォルト値 512
//影の暗さ
spotLight.shadowDarkness = 1.0;	//デフォルト値 0.5

シャドーカメラの可視化

シャドーカメラの視体積内のオブジェクトが影描画の対象

	//シャドーカメラの可視化
spotLight.shadowCameraVisible = true;

シャドーイングのまとめ

  • 3次元空間における位置関係を与えるのに有効な手法。
  • コンピュータ・グラフィックスで最も一般的なシャドーイング手法は、シャドーマッピングと呼ばれるレンダリングによる実装。
  • three.jsでも、(1)レンダラーオブジェクト(2)光源オブジェクト(3)影生成元のオブジェクト(4)影描画オブジェクトの各プロパティを適切に設定することで、シャドーマッピングが簡単に実装可能。
  • three.jsにて、シャドーマッピングが可能な光源は平行光源スポットライト光源の2つ。
  • 点光源やその他の光源に対してシャドーマッピングを行いたい場合には、平行光源あるいはスポットライト光源のシャドーカメラだけを拝借する。

【第2部】
ライティングとシェーディング
終了

three.jsの始め方