ぱらなのブログ

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になる

カメラ方向に弾が飛ぶので、ちょっとゲームっぽくなってきました。