mirror of
https://github.com/godotengine/godot.git
synced 2026-01-03 18:11:19 +03:00
Add the ability to look-at in model-space.
This is a much simpler attempt to solve the same problem as #76060, but without breaking any compatibility. * Adds a description of what model space is in the Vector3 enums (MODEL_* constants). This has the proper axes laid out for imported 3D assets. * Adds the option to `look_at` using model_space, which uses Vector3.MODEL_FRONT as forward vector. The attempt of this PR is to still break the assumption that there is a single direction of forward (which is not the case in Godot) and make it easier to understand where 3D models are facing, as well as orienting them via look_at.
This commit is contained in:
committed by
Silc Lizard (Tokage) Renew
parent
d5c1b9f883
commit
5fdc1232ef
@@ -908,22 +908,23 @@ void Node3D::set_identity() {
|
||||
set_transform(Transform3D());
|
||||
}
|
||||
|
||||
void Node3D::look_at(const Vector3 &p_target, const Vector3 &p_up) {
|
||||
void Node3D::look_at(const Vector3 &p_target, const Vector3 &p_up, bool p_use_model_front) {
|
||||
ERR_THREAD_GUARD;
|
||||
ERR_FAIL_COND_MSG(!is_inside_tree(), "Node not inside tree. Use look_at_from_position() instead.");
|
||||
Vector3 origin = get_global_transform().origin;
|
||||
look_at_from_position(origin, p_target, p_up);
|
||||
look_at_from_position(origin, p_target, p_up, p_use_model_front);
|
||||
}
|
||||
|
||||
void Node3D::look_at_from_position(const Vector3 &p_pos, const Vector3 &p_target, const Vector3 &p_up) {
|
||||
void Node3D::look_at_from_position(const Vector3 &p_pos, const Vector3 &p_target, const Vector3 &p_up, bool p_use_model_front) {
|
||||
ERR_THREAD_GUARD;
|
||||
ERR_FAIL_COND_MSG(p_pos.is_equal_approx(p_target), "Node origin and target are in the same position, look_at() failed.");
|
||||
ERR_FAIL_COND_MSG(p_up.is_zero_approx(), "The up vector can't be zero, look_at() failed.");
|
||||
ERR_FAIL_COND_MSG(p_up.cross(p_target - p_pos).is_zero_approx(), "Up vector and direction between node origin and target are aligned, look_at() failed.");
|
||||
|
||||
Transform3D lookat = Transform3D(Basis::looking_at(p_target - p_pos, p_up), p_pos);
|
||||
Vector3 forward = p_target - p_pos;
|
||||
Basis lookat_basis = Basis::looking_at(forward, p_up, p_use_model_front);
|
||||
Vector3 original_scale = get_scale();
|
||||
set_global_transform(lookat);
|
||||
set_global_transform(Transform3D(lookat_basis, p_pos));
|
||||
set_scale(original_scale);
|
||||
}
|
||||
|
||||
@@ -1166,8 +1167,8 @@ void Node3D::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("orthonormalize"), &Node3D::orthonormalize);
|
||||
ClassDB::bind_method(D_METHOD("set_identity"), &Node3D::set_identity);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("look_at", "target", "up"), &Node3D::look_at, DEFVAL(Vector3(0, 1, 0)));
|
||||
ClassDB::bind_method(D_METHOD("look_at_from_position", "position", "target", "up"), &Node3D::look_at_from_position, DEFVAL(Vector3(0, 1, 0)));
|
||||
ClassDB::bind_method(D_METHOD("look_at", "target", "up", "use_model_front"), &Node3D::look_at, DEFVAL(Vector3(0, 1, 0)), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("look_at_from_position", "position", "target", "up", "use_model_front"), &Node3D::look_at_from_position, DEFVAL(Vector3(0, 1, 0)), DEFVAL(false));
|
||||
|
||||
ClassDB::bind_method(D_METHOD("to_local", "global_point"), &Node3D::to_local);
|
||||
ClassDB::bind_method(D_METHOD("to_global", "local_point"), &Node3D::to_global);
|
||||
|
||||
Reference in New Issue
Block a user