海のようなオブジェクトを作成します。
透明な水を表現する場合には、create.waterを使用してください。
環境マップを利用したほうが、よりリアルな海面を表現できます。
load.background で環境マップを読み込んでおくことをお勧めします。
sizeには十分大きな値を指定してください。
phi は太陽の方位角、theta は太陽の頂点からの角度を指定します。
戻り値はメッシュと、update関数です。
update関数は、deltaを引数に取ります。
update関数をanimateの中で呼ぶことで、海の動きを更新します。
通常、ジオメトリは PlaneGeometryを使用します。
sizeはこのジオメトリのサイズを指定します。
他のジオメトリを使用する場合は、geometryで指定してください。
テクスチャは、水面を表すためのノーマルマップを指定してください。
自作する場合は、Processingのnoise()などでパーリンノイズのグレースケール画像を作成し、NormalMap-Onlineなどのツールでノーマルマップに変換してください。
シームレスなノーマルマップにするには、GIMPのフィルターを使用すると便利です。
easy-three では、サンプルの水面テクスチャを2つ用意しています。
どちらもeasy-threeのオリジナル制作物であり、CC-0ライセンスで再配布を含め自由にお使いいただけます。
const { camera, controls, create, animate } = init()
controls.connect();
camera.position.set(0, 4, -4);
create.ambientLight({ intensity: 1 });
create.directionalLight({ intensity: 3 });
create.sky();
const cube = create.cube({ position: [0, 2, 0] });
const ocean = create.ocean("/easy-three/texture/water/NormalMap-1.jpg");
animate(({ delta }) => {
ocean.update(delta)
cube.rotation.x += delta;
cube.rotation.y += delta;
});const { camera, controls, create, animate, THREE } = init()
controls.connect();
camera.position.set(0, 4, -4);
create.ambientLight({ intensity: 1 });
create.directionalLight({ intensity: 3 });
create.sky();
const ocean = create.ocean("/easy-three/texture/water/NormalMap-2.jpg", {
geometry: new THREE.SphereGeometry(3, 32, 32),
});
animate(({ delta }) => {
ocean.update(delta)
});