「シェーディング」とは日本語で「陰影づけ」の意味
人目に映る物体の質感 = 反射光
「①反射材質」と「②光源」の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);
光線ベクトル(光源から発せられる光の向き)が
空間内の位置に依らず一定となる光源
光線ベクトルと法線ベクトルの関係性で
描画色が決定される材質(数理モデル)
必ず法線ベクトルを与える必要がある!
光線ベクトルと法線ベクトルの関係性だけで
描画色が決定される材質
カメラの位置には依存しない!→ マッドな感じ
光線ベクトルとカメラの位置ベクトルの関係性で
光沢感(鏡面色)も描画される材質
フォン反射材質はランバート反射材質の拡張版!
//フォン反射材質の準備 var material = new THREE.MeshPhongMaterial({ color:0xFF0000, //拡散色 specular: 0xFFFFFF, //鏡面色 shininess: 200 //鏡面指数 });
//平行光源オブジェクトの生成 directionalLight = new THREE.DirectionalLight(0x00FFFF, 1.0); //<--------赤成分を無くす
描画色 = 材質の拡散色×光源色 + 材質の鏡面色×光源色
存在する全ての物体を全方位から照らす光源(架空の光源)
太陽光による物体の影が真っ暗でない理由がこれ!
//環境光オブジェクトの生成 ambientLight = new THREE.AmbientLight(0x555555); //環境光オブジェクトのシーンへの追加 scene.add(ambientLight);
※全体的に白っぽくなってしまいました
//フォン反射材質の準備 var material = new THREE.MeshPhongMaterial({ color:0xFF0000, //拡散色 ambient: 0x550000, //環境色 <-------------追記 specular: 0xFFFFFF, //鏡面色 shininess: 200 //鏡面指数 });
全方位に光を発することのできる光源
点光源の効果をわかりやすくするため、平面オブジェクトの準備も行います。
//形状オブジェクトの宣言と生成 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次元空間中の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);
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;