fix un-scaling in Spatial::look_at_from_position
As mentioned in https://github.com/godotengine/godot/pull/26897#issuecomment-491178089 the look-at scaling issue solved by PR #26897 happens also in another look-at method. Spatial::look_at_from_position() also does not have same input checking Spatial::look_at() has. Therefore, I fixed it too at same time.
This commit is contained in:
parent
9742d0c323
commit
48e4d62554
1 changed files with 16 additions and 15 deletions
|
@ -675,28 +675,29 @@ void Spatial::set_identity() {
|
||||||
|
|
||||||
void Spatial::look_at(const Vector3 &p_target, const Vector3 &p_up) {
|
void Spatial::look_at(const Vector3 &p_target, const Vector3 &p_up) {
|
||||||
|
|
||||||
Transform lookat(get_global_transform());
|
Vector3 origin(get_global_transform().origin);
|
||||||
if (lookat.origin == p_target) {
|
look_at_from_position(origin, p_target, p_up);
|
||||||
ERR_EXPLAIN("Node origin and target are in the same position, look_at() failed");
|
|
||||||
ERR_FAIL();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p_up.cross(p_target - lookat.origin) == Vector3()) {
|
|
||||||
ERR_EXPLAIN("Up vector and direction between node origin and target are aligned, look_at() failed");
|
|
||||||
ERR_FAIL();
|
|
||||||
}
|
|
||||||
Vector3 original_scale(lookat.basis.get_scale());
|
|
||||||
lookat = lookat.looking_at(p_target, p_up);
|
|
||||||
// as basis was normalized, we just need to apply original scale back
|
|
||||||
lookat.basis.scale(original_scale);
|
|
||||||
set_global_transform(lookat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spatial::look_at_from_position(const Vector3 &p_pos, const Vector3 &p_target, const Vector3 &p_up) {
|
void Spatial::look_at_from_position(const Vector3 &p_pos, const Vector3 &p_target, const Vector3 &p_up) {
|
||||||
|
|
||||||
|
if (p_pos == p_target) {
|
||||||
|
ERR_EXPLAIN("Node origin and target are in the same position, look_at() failed");
|
||||||
|
ERR_FAIL();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_up.cross(p_target - p_pos) == Vector3()) {
|
||||||
|
ERR_EXPLAIN("Up vector and direction between node origin and target are aligned, look_at() failed");
|
||||||
|
ERR_FAIL();
|
||||||
|
}
|
||||||
|
|
||||||
Transform lookat;
|
Transform lookat;
|
||||||
lookat.origin = p_pos;
|
lookat.origin = p_pos;
|
||||||
|
|
||||||
|
Vector3 original_scale(get_global_transform().basis.get_scale());
|
||||||
lookat = lookat.looking_at(p_target, p_up);
|
lookat = lookat.looking_at(p_target, p_up);
|
||||||
|
// as basis was normalized, we just need to apply original scale back
|
||||||
|
lookat.basis.scale(original_scale);
|
||||||
set_global_transform(lookat);
|
set_global_transform(lookat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue