Siv3Dで3Dゲームを作ってみる 4 FPS風に弾を飛ばす
カメラの向いている向きに弾を飛ばしたい
Graphics3D::GetCamera()でカメラの情報を取得できます。
posは座標です。
lookatですが、これはその座標に向かってカメラが向きます。カメラの見ている方角ではないです。ちょっと癖がありますね。
とはいえ、ベクトル計算すれば問題ないです。
# include <Siv3D.hpp> void Main() { Window::Resize(1000, 750); Vec3 spd = Vec3::Zero, pos = Vec3::Zero; Graphics3D::SetLight(1, Light::Point(Vec3(0, 40, 0), 100, ColorF(1.0, 1.0, 1.0))); while (System::Update()) { Graphics3D::FreeCamera(); //発射 if (Input::KeyZ.clicked) { auto c = Graphics3D::GetCamera(); spd = (c.lookat - c.pos) * 0.01; pos = c.pos; } pos += spd; //draw double offset = 10; //床 Plane(Vec3(0, -offset / 3, 0), 20).draw(); //奥の壁 Plane(Vec3(0, 0, offset), 20, Quaternion::Identity().rotatePitch(-90_deg)).draw(); //右の壁 Plane(Vec3(offset, 0, 0), 20, Quaternion::Identity().rotateRoll(-90_deg)).draw(); //左 Plane(Vec3(-offset, 0, 0), 20, Quaternion::Identity().rotateRoll(90_deg)).draw(); //弾 Sphere(pos, 0.7).draw(Palette::Yellow); } }
z押すとカメラの向いている方向に弾が飛んでいきます
spd = (c.lookat - c.pos) * 0.01;が弾の角度計算です。ただのベクトル計算ですね。
今回は適当でいいのでやりませんでしたが、角度に速度をかけて使うときなどはVec3::normalizedを使って単位ベクトルに変換した方がいいでしょう。
auto x = (c.lookat - c.pos).normalized(); //xの長さが1になる
カメラ方向に弾が飛ぶので、ちょっとゲームっぽくなってきました。