見ている人がいるか知らんがメモ
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();
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)));
while (System::Update())
{
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);
}
}