参考URL
https://ics.media/tutorial-three/material_variation/
// マテリアル生成 const material = new THREE.Mesh~~~Material({ color: 0x86A8E7, });
ライティングの影響を受けない、塗りつぶされたマテリアル
ノーマルカラーをRGBで可視化する。Obj発光でライティング不要。手軽な動作確認用
ランバートシェーディング。光沢感のないマットな質感。ライト必要で陰影による奥行きを表現
フォンシェーディング。光沢感のある質感表現
ライト必要。アニメのような
ライト必要
現実的な物理現象の再現
prop roughness: 0 ~ 1
0: 光沢
1: マット
THREE.AmbientLight(0xFFFFFF, 1.0)
prop intensity
陰影ができない。立体感なし。他のライトと併用
const light = new THREE.DirectionalLight(0x5FFBF1); light.intensity = 1; // 光の強さを倍にする light.position.set(1, 1, 2); // ライトの方向、始点位置 scene.add(light); // シーンに追加
特定方向からの光。太陽光のようなもの
new THREE.HemisphereLight(0xFFFFFF, 0xD16BA5, 1.0); // props color, reflect-color, intensity
一点から360度照らす
const pointLight = new THREE.PointLight(0xff0000, 5, 100, 1.0); pointLight.position.set(15, 15, 10); // props(color, intensity, distance:光の距離, dicay:減衰率) // new THREE.TorusGeometry(10, 3, 16, 40) // camera.position.set(0, 0, 200) // 照明の可視化ヘルパー const lightHelper = new THREE.PointLightHelper(pointLight); scene.add(lightHelper);
結構扱い難しい
単体だと周回させないと歪に見える
立体感、臨場感の演出
https://threejs.org/docs/#api/en/lights/SpotLight
const spotLight = new THREE.SpotLight(0xffffff, 4, 50, Math.PI / 6, 0, 0.5); scene.add(spotLight); spotLight.position.set(25, 25, 15) const lightHelper = new THREE.SpotLightHelper(spotLight); scene.add(lightHelper);
props(色, 強さ, 距離, angle(照射角), ボケ度合い:Float, 減衰率:Float)
減衰率が1に近づくほど弱くなる
床作って検証するとわかりやすい
ヘルパークラスのワイヤーフレームで範囲を可視化
Math.PIについて
https://www.javadrive.jp/javascript/math_class/index22.html
矩形平面に均一に放出される光源。明るい窓やストリップ照明のシミュレーション
props(color, intensity, width, height)
const rectLight = new THREE.RectAreaLight(0xFFFFFF, 3.0, 20, 20); rectLight.position.set(20, 20, 20); scene.add(rectLight)
補足
サイズ指定した場合、(0, 0, 0)はオブジェクトの中心に来る
4つの手順
renderer.shadowMap.enabled = true;
spotLight.castShadow = true;
castObj.castShadow = true;
receiveObj.receiveShadow = true;
影の解像度を指定する:2の累乗
spotLight.shadow.mapSize.width = 2048; spotLight.shadow.mapSize.height = 2048;
動的な影と静的な影
動的:シャドウマップサイズを利用した計算量が多く自由度の高い影。制度は低い
静的:テクスチャに作成しておくベイク。計算量が少なく高速
Perspective
fov = Field of View で視野角を調整 camera.fov = 60
数値が低ければ望遠、高ければ広角
// カメラ作成 params(画角, アスペクト, 描画開始距離, 描画終了距離) const camera = new THREE.PerspectiveCamera( 45, // fov width / height, 1, 10000 );
Orthographic:タクティクスゲームのようなビジュアル
// カメラ作成 params(原点からの描画範囲-left,+right,top,-bottom, 描画開始距離, 描画終了距離) const camera = new THREE.OrthographicCamera( -240, +240, 135, -135, 1, 1000 );
クリッピング
near, far プロップのこと
レンダリングを行う区間距離を制御
ピント調整によるボケの演出
奥行きを表現する
具体的に
シーンのfogプロパティにカラー、開始距離、終点距離を指定したTHREE.Fogインスタンスを代入
//シーン作成 const scene = new THREE.Scene(); scene.fog = new THREE.Fog(0x000000, 5, 2000);
Objのランダム追加
// グループを作成 const group = new THREE.Group(); scene.add(group); // ジオメトリ生成 props(width, height, depth) const geometry = new THREE.TorusGeometry(10, 3, 16, 30); // マテリアル生成 const material = new THREE.MeshStandardMaterial({ color: 0xD16BA5, roughness: 0, }); for (let i = 0; i < 1000; i++) { const mesh = new THREE.Mesh(geometry, material); mesh.position.x = (Math.random() - 0.5) * 1500; mesh.position.y = (Math.random() - 0.5) * 1500; mesh.position.z = (Math.random() - 0.5) * 1500; mesh.rotation.x = Math.random() * 2 * Math.PI; mesh.rotation.y = Math.random() * 2 * Math.PI; mesh.rotation.z = Math.random() * 2 * Math.PI; // グループに格納する group.add(mesh); }
常に正面を向くオブジェクト ≒ ビルボード
ポリゴン数の節約に効果的。
煙などのパーティクル表現で負荷を抑えることができる
インスタンス化してマテリアルを作成する
TOP PAGE// マテリアルを作成する const material = new THREE.SpriteMaterial({ map: new THREE.TextureLoader().load('画像パス'), }); // フォグの適用 material.fog = true; // マテリアルをコンストラクタで設定してadd()メソッドで追加する const sprite = new THREE.Sprite(material); // スケール調整 sprite.scale.set(10, 10, 10); scene.add(sprite);