fix: correct scene view fly and pan controls

This commit is contained in:
2026-03-28 18:37:18 +08:00
parent 569f8ef725
commit a519fdab7d
4 changed files with 21 additions and 16 deletions

View File

@@ -92,6 +92,8 @@ TEST(SceneViewportCameraController_Test, PanAndZoomUpdateCameraStateConsistently
const Vector3 initialPosition = controller.GetPosition();
const Vector3 initialFocus = controller.GetFocalPoint();
const float initialDistance = controller.GetDistance();
const Vector3 right = Vector3::Normalize(Vector3::Cross(Vector3::Up(), controller.GetForward()));
const Vector3 up = Vector3::Normalize(Vector3::Cross(controller.GetForward(), right));
SceneViewportCameraInputState input = {};
input.viewportHeight = 720.0f;
@@ -103,6 +105,10 @@ TEST(SceneViewportCameraController_Test, PanAndZoomUpdateCameraStateConsistently
EXPECT_FALSE(NearlyEqual(controller.GetPosition(), initialPosition));
EXPECT_FALSE(NearlyEqual(controller.GetFocalPoint(), initialFocus));
EXPECT_LT(controller.GetDistance(), initialDistance);
const Vector3 panDelta = controller.GetFocalPoint() - initialFocus;
EXPECT_NEAR(Vector3::Dot(panDelta, controller.GetForward()), 0.0f, 1e-3f);
EXPECT_GT(std::abs(Vector3::Dot(panDelta, right)), 0.0f);
EXPECT_GT(std::abs(Vector3::Dot(panDelta, up)), 0.0f);
EXPECT_TRUE(NearlyEqual(
controller.GetFocalPoint(),
controller.GetPosition() + controller.GetForward() * controller.GetDistance(),
@@ -116,6 +122,8 @@ TEST(SceneViewportCameraController_Test, FlyInputMovesCameraAndFocalPointTogethe
const Vector3 initialPosition = controller.GetPosition();
const Vector3 initialFocus = controller.GetFocalPoint();
const Vector3 initialOffset = initialFocus - initialPosition;
const Vector3 forward = controller.GetForward();
const Vector3 right = Vector3::Normalize(Vector3::Cross(Vector3::Up(), forward));
SceneViewportCameraInputState input = {};
input.viewportHeight = 720.0f;
@@ -126,6 +134,9 @@ TEST(SceneViewportCameraController_Test, FlyInputMovesCameraAndFocalPointTogethe
EXPECT_FALSE(NearlyEqual(controller.GetPosition(), initialPosition));
EXPECT_FALSE(NearlyEqual(controller.GetFocalPoint(), initialFocus));
const Vector3 positionDelta = controller.GetPosition() - initialPosition;
EXPECT_GT(std::abs(Vector3::Dot(positionDelta, forward)), 0.0f);
EXPECT_GT(std::abs(Vector3::Dot(positionDelta, right)), 0.0f);
EXPECT_TRUE(NearlyEqual(controller.GetFocalPoint() - controller.GetPosition(), initialOffset, 1e-3f));
}