|
@@ -2287,9 +2287,27 @@ void Node3DEditorViewport::_update_freelook(real_t delta) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
|
|
|
+ const FreelookNavigationScheme navigation_scheme = (FreelookNavigationScheme)EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_navigation_scheme").operator int();
|
|
|
+
|
|
|
+ Vector3 forward;
|
|
|
+ if (navigation_scheme == FREELOOK_FULLY_AXIS_LOCKED) {
|
|
|
+ // Forward/backward keys will always go straight forward/backward, never moving on the Y axis.
|
|
|
+ forward = Vector3(0, 0, -1).rotated(Vector3(0, 1, 0), camera->get_rotation().y);
|
|
|
+ } else {
|
|
|
+ // Forward/backward keys will be relative to the camera pitch.
|
|
|
+ forward = camera->get_transform().basis.xform(Vector3(0, 0, -1));
|
|
|
+ }
|
|
|
+
|
|
|
const Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0));
|
|
|
- const Vector3 up = camera->get_transform().basis.xform(Vector3(0, 1, 0));
|
|
|
+
|
|
|
+ Vector3 up;
|
|
|
+ if (navigation_scheme == FREELOOK_PARTIALLY_AXIS_LOCKED || navigation_scheme == FREELOOK_FULLY_AXIS_LOCKED) {
|
|
|
+ // Up/down keys will always go up/down regardless of camera pitch.
|
|
|
+ up = Vector3(0, 1, 0);
|
|
|
+ } else {
|
|
|
+ // Up/down keys will be relative to the camera pitch.
|
|
|
+ up = camera->get_transform().basis.xform(Vector3(0, 1, 0));
|
|
|
+ }
|
|
|
|
|
|
Vector3 direction;
|
|
|
|