カメラの回り込み
ヴート  2023/08/08(Tue) 10:21
フォーカスポジションを中心にアイポジションを回転させようと思ったのですが、X軸系やZ軸系が意図しない挙動をしてしまいます。
このプログラムには一体何が足りないのでしょうか?
知見のある方にはご鞭撻のほどお願いいたします。

#include<Siv3D.hpp>
using App = SceneManager<String>;

class test :public App::Scene
{
public:
struct Camera
{
Size size{ Window::GetState().virtualSize };
Vec3 ep{ 0,0,50 };
Vec3 fp{ 0,0,0 };
double radian{ 60 };
BasicCamera3D C{};
}; Camera cmr;

Array<Vec3>pt{ {0,0,20},{10,10,0},{10,-10,0},{-10,-10,0},{-10,10,0} };
LineString p2{};
Polygon p3{};

void setCmr()
{
cmr.C.setProjection(cmr.size, ToRadians(cmr.radian));
cmr.C.setView(cmr.ep, cmr.fp);
Graphics3D::SetCameraTransform(cmr.C);
}

void ctrlCmr()
{
if (KeyRight.pressed())
{
cmr.ep = Mat4x4::RotateY(ToRadians(1)).transformPoint(cmr.ep);
}
if (KeyLeft.pressed())
{
cmr.ep = Mat4x4::RotateY(ToRadians(-1)).transformPoint(cmr.ep);
}
if (KeyUp.pressed())
{
cmr.ep = Mat4x4::RotateX(ToRadians(-1)).transformPoint(cmr.ep);
}
if (KeyDown.pressed())
{
cmr.ep = Mat4x4::RotateX(ToRadians(1)).transformPoint(cmr.ep);
}
}

test01(const InitData& init) :IScene{ init }
{

}
void update()override
{
ctrlCmr();
setCmr();

p2.clear();
for (int32 i{ 0 }; i < pt.size(); i++)
p2.push_back(cmr.C.worldToScreenPoint(pt.at(i)).xy());

p3 = Geometry2D::ConvexHull(p2);
}
void draw()const override
{
Line{ Vec2(0,cmr.size.y / 2),Vec2(cmr.size.x,cmr.size.y / 2) }.draw(Palette::Red);
Line{ Vec2(cmr.size.x / 2,0),Vec2(cmr.size.x / 2,cmr.size.y) }.draw(Palette::Red);

p3.drawFrame();

for (int32 i{ 0 }; i < p2.size(); i++)
p2[i].asCircle(10).draw();
}
};

void Main()
{
Window::Resize(1600, 960);

FontAsset::Register(U"F_001", 15);

App manager;
manager.add<test>(U"test");
manager.init(U"test");

while (System::Update())
if (!manager.update())
break;
}
記事編集
Reputeless  2023/08/08(Tue) 13:07
回転の中心に対して円柱座標系や球面座標系を使ってみると良いと思います。
https://zenn.dev/reputeless/books/siv3d-documentation/viewer/tutorial-3d-2

このサンプルも参考になります。
https://gist.github.com/Reputeless/834bda9457df2a6015df39c2d3d0eed6
編集
ヴート  2023/08/09(Wed) 21:42
解答ありがとうございます。

サンプルを参考にカメラを操作してみましたが、改善されませんでした。
カメラの角度が一定を超えると、座標がジャンプして図形の向きが逆転することがあり、それの改善方法を探していました。

説明不十分あるいは問題箇所の勘違いだったようです。
申し訳ありませんでした。
編集
Reputeless  2023/08/10(Thu) 14:59
eyePosition, focusPosition が正しいという前提であれば、カメラの upDirection を定めないとカメラの回転が意図通りにならない場合があります。
下記のサンプルでは upDirection を活用しています。
https://zenn.dev/reputeless/books/siv3d-documentation/viewer/tutorial-3d-intersection#38.5-viewfrustum
編集
ヴート  2023/08/13(Sun) 11:17
upDirectionを指定し、ようやく思うような挙動をさせられるようになりました。

解答いただきありがとうございました。
編集
件名
Re: カメラの回り込み
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -