このセクションでは、テクスチャを使った3Dオブジェクトの作成方法を学びます。
テクスチャとは、3Dオブジェクトに貼り付ける画像のことです。
背景画像と同じく、無料で入手するには、 Poly Haven のようなサイトを利用すると便利です。
テクスチャ画像は、Poly Haven では Textures として配布されています。
ここでは、Poly Haven のCoast Sand Rocks 02を利用してみましょう。
ページ右上のところで、「1K」の解像度を選択し、 その右の形式の選択では「ZIP」を選んでおきます。
ダウンロードボタンの右のメニューから 「Diffuse」と「Normal(GL)」のJPG形式を選択してダウンロードします。
ダウンロードした画像は、 プログラムのファイルと同じ場所に配置してください。
Diffuse は、色の情報を持つ画像で、 いわゆる通常の画像です。
Normal は、法線マップと呼ばれる情報を持つ画像で、 3Dオブジェクトの凹凸を表現するのに使います。
テクスチャを読み込むには、load.texture を使います。
load.texture(画像のパス)今の場合、次のようにするとキューブにテクスチャが設定されます。
const { camera, create, animate, controls } = init()
controls.connect()
camera.position.set(0, 1, 2)
controls.autoRotate = true
create.ambientLight()
create.directionalLight()
create.cube({
option: {
map: load.texture("./coast_sand_rocks_02_diff_1k.jpg"),
}
})
animate()
実行すると、キューブにテクスチャが貼り付けられます。
ただ画像を貼り付けただけなので、表面のデコボコ感はありません。
法線マップを使うことで、3Dオブジェクトの凹凸を表現することができます。
その場合は、次のようにします。
const { camera, create, animate, controls } = init()
controls.connect()
camera.position.set(0, 1, 2)
controls.autoRotate = true
create.ambientLight()
create.directionalLight()
create.cube({
option: {
map: load.texture("./coast_sand_rocks_02_diff_1k.jpg"),
normalMap: load.texture("./coast_sand_rocks_02_nor_gl_1k.jpg"),
}
})
animate()
法線マップがあるものとないものを並べてみると、 次のようになります。
左が法線マップなし、右が法線マップありです。
表面の質感のリアルさが全く違うことがわかります。
このように、法線マップを使うことでよりリアルな3Dオブジェクトを作成することができますが、マップ画像の用意は場合によっては難しいことがあります。
そのような場合は、通常のテクスチャ画像をバンプマップとして使うことで、似たような効果を得ることができます。
バンプマップとは、法線マップと同じように凹凸を表現する画像ですが、 ピクセルの明るさを使って凹凸を表現します。
普通、白い部分が凸、黒い部分が凹となることが多いため、通常のテクスチャ画像を使うことができます。
バンプマップを使う場合は、bumpMap を設定します。
また、凹凸の強さを設定するために、bumpScale を使います。
同じ画像を2回読み込むのは効率が悪いので、load.texture で読み込んだテクスチャを変数に保存して使いましょう。
const { camera, create, animate, controls } = init()
controls.connect()
camera.position.set(0, 1, 2)
controls.autoRotate = true
create.ambientLight()
create.directionalLight()
const texture = load.texture("./coast_sand_rocks_02_diff_1k.jpg")
create.cube({
option: {
map: texture,
bumpMap: texture,
bumpScale: 3,
}
})
animate()
法線マップの場合とバンプマップの場合を比較すると、 次のようになります。
左が法線マップ、右がバンプマップです。
バンプマップは法線マップよりも簡単に使える反面、 凹凸の表現が荒いことがあります。
また、凹凸の強さを調整するために、bumpScale を設定する必要があります。
1つのオブジェクトに対して、1つのテクスチャを繰り返し貼ることもできます。
create.cube({
option: {
map: load.texture("./coast_sand_rocks_02_diff_1k.jpg", {
repeat: [2, 3],
}),
}
})このようにすると、テクスチャが横に2回、縦に3回繰り返し貼られます。
テクスチャを使うことで、3Dオブジェクトの表面の質感をリアルに表現することができます。
基本的には法線マップを使うことが望ましいですが、 難しい場合はバンプマップを使うと良いでしょう。