Siv3Dで3Dゲームを作ってみる 3 Planeで部屋を組み立てる・光源の配置
ろくに進んでないのにもう3つ目の記事ですが、のんびりやっていきましょう。
今回は部屋を作ってみます。
部屋ならキューブを用意してカメラを中に入れることでも実現できると思いますが、今回は3D空間でオブジェクトを配置することに慣れるためにもPlaneを使って組み立ててみることにします。
前回作ったプログラムで数値と描画位置を確かめながら配置していきます。
こんな感じで置いてみると部屋っぽい空間が作れそうです。
double offset = 10; //床 Plane(Vec3(0, -offset / 3, 0), 20).draw(Palette::Blue); //奥の壁 Plane(Vec3(0, 0, offset), 20, Quaternion::Identity().rotatePitch(-90_deg)).draw(); //右の壁 Plane(Vec3(offset, 0, 0), 20, Quaternion::Identity().rotateRoll(-90_deg)).draw(Palette::Violet); //左 Plane(Vec3(-offset, 0, 0), 20, Quaternion::Identity().rotateRoll(90_deg)).draw(Palette::Red);
…あれ、右の壁なくね?
右の壁はどうなったのか
実は右の壁は描画されています。Graphics::SetBackgroundを使って背景色をつけると黒い壁がちゃんとあります。そうです、黒いんですよ。
なぜ黒いのか、なんとなく知識があったので思い当たるものを試してみたところやっぱり光が当たっていませんでした。
球などの物体と違い、光の処理をいい感じに勝手にしてくれないので当たらない面が完全に真っ黒になっていたというわけです。デフォルトだと平行光源らしいのでそりゃ見えないでしょう。ちなみにFreeCameraをつけて右側に抜けてみるとちゃんと紫色の壁が確認できます。
とにかく見えればいいので、リファレンスを見ながら0,0,0の位置にとても明るい点光源を設置してみました。これならカメラの見える位置は全て照らされるはずです。
# include <Siv3D.hpp> void Main() { Graphics3D::SetLight(1, Light::Point(Vec3::Zero, 100, ColorF(1.0, 1.0, 1.0))); while (System::Update()) { Graphics3D::FreeCamera();[f:id:Para7:20181001180930p:plain] double offset = 10; //床 Plane(Vec3(0, -offset / 3, 0), 20).draw(Palette::Blue); //奥の壁 Plane(Vec3(0, 0, offset), 20, Quaternion::Identity().rotatePitch(-90_deg)).draw(); //右の壁 Plane(Vec3(offset, 0, 0), 20, Quaternion::Identity().rotateRoll(-90_deg)).draw(Palette::Violet); //左 Plane(Vec3(-offset, 0, 0), 20, Quaternion::Identity().rotateRoll(90_deg)).draw(Palette::Red); } }
ちゃんと壁が描画されました。わーい。
光源はかなり雑なのでちょっと調整が必要ですね。とはいえ、きちんと見えるようになったのでとりあえず目的は達成です。
土台部分が少しずつ出来てきました。
挫折しなければ次回に続きます。