gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

Siv3D カメラ 回転 マウス

見ている人がいるか知らんがメモ

Siv3Dというすばらしいライブラリに出会ったので少し触っています.

Play Siv3D!

去年シリアル通信や3Dにも対応したみたいで,今後の発展が楽しみです.

で,既存のカメラがキーボード入力のみで,視点回転ができず?だったのでマウスでできるようにしました.

【注意】操作バグありますがビューワー程度には使えるかと・・・

使い方は,Graphics3D::FreeCamera()を呼ばずにoperateCameraByMouse(double)を呼ぶだけ

右ドラッグで回転,ホイールでズームします

今後の課題
原点を中心にしか回転できないので改善します
なんかズームおかしい
カメラ位置がx<0のとき上下逆になる

# include <Siv3D.hpp>


void operateCameraByMouse(const double SPEED)
{
	//前フレームのカメラ設定をコピー
	struct Camera camera = Graphics3D::GetCamera();

	//カメラの回転移動 マウスの右ボタンを使用
	if (Input::MouseR.pressed){

		const Point delta = Mouse::Delta(); //マウスカーソルの移動量

		//原点(0,0)を中心にカメラが回転移動
		Quaternion rotate = Quaternion::Identity();
		rotate.rotateRollPitchYaw(0, Radians(SPEED*delta.y), Radians(SPEED*delta.x));
		camera.pos = rotate * camera.pos;
	}

	//カメラのズーム マウスホイールを使用
	const int wheelY = Mouse::Wheel(); // 縦方向のホイール回転量
	camera.pos = Vec3(
		camera.pos.x + (camera.pos.x*SPEED*wheelY),
		camera.pos.y + (camera.pos.y*SPEED*wheelY),
		camera.pos.z + (camera.pos.z*SPEED*wheelY));

	Graphics3D::SetCamera(camera);
}


void Main()
{
	Cylinder x_axis_model(Vec3(0, 0, 0), 1.0, 1000.0, Quaternion(Vec3(0, 0, 1), Radians(90)));
	Cylinder y_axis_model(Vec3(0, 0, 0), 1.0, 1000.0, Quaternion(Vec3(0, 0, 0), Radians(0)));
	Cylinder z_axis_model(Vec3(0, 0, 0), 1.0, 1000.0, Quaternion(Vec3(1, 0, 0), Radians(90)));
	
	//main loop
	while (System::Update())
	{
		//Graphics3D::FreeCamera();
		operateCameraByMouse(0.1);

		x_axis_model.draw(Palette::Red);
		y_axis_model.draw(Palette::Green);
		z_axis_model.draw(Palette::Blue);

		Plane(1000).draw();
		Sphere(Vec3(0, 0, 0), 2).draw(Palette::Orange);
		Sphere(Vec3(10, 0, 0), 2).draw(Palette::Red);
		Sphere(Vec3(0, 10, 0), 2).draw(Palette::Green);
		Sphere(Vec3(0, 0, 10), 2).draw(Palette::Blue);
	}
}