system
March 21, 2023, 5:11pm
1
Attention
Topic was automatically imported from the old Question2Answer platform.
Asked By
PiCode
Is there a way to do toLocal() without using node, but instead calculate it using basis as the direction? Or just using anything other than node. I don’t want to create a node to do toLocal(). It’s kind of not efficient.
system
March 21, 2023, 5:44pm
2
Reply From:
zhyrin
Sure! You can check out the implementation of how to_local()
works and recreate it in any other script.
}
s = s->data.parent;
}
return true;
}
void Node3D::rotate_object_local(const Vector3 &p_axis, real_t p_angle) {
ERR_THREAD_GUARD;
Transform3D t = get_transform();
t.basis.rotate_local(p_axis, p_angle);
set_transform(t);
}
void Node3D::rotate(const Vector3 &p_axis, real_t p_angle) {
ERR_THREAD_GUARD;
Transform3D t = get_transform();
t.basis.rotate(p_axis, p_angle);
set_transform(t);
}
}
operator String() const;
Transform3D() {}
Transform3D(const Basis &p_basis, const Vector3 &p_origin = Vector3());
Transform3D(const Vector3 &p_x, const Vector3 &p_y, const Vector3 &p_z, const Vector3 &p_origin);
Transform3D(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz, real_t zx, real_t zy, real_t zz, real_t ox, real_t oy, real_t oz);
};
_FORCE_INLINE_ Vector3 Transform3D::xform(const Vector3 &p_vector) const {
return Vector3(
basis[0].dot(p_vector) + origin.x,
basis[1].dot(p_vector) + origin.y,
basis[2].dot(p_vector) + origin.z);
}
_FORCE_INLINE_ Vector3 Transform3D::xform_inv(const Vector3 &p_vector) const {
Vector3 v = p_vector - origin;
return Vector3(
func to_local(global_transform: Transform3D, global_position: Vector3) -> Vector3:
var xform := global_transform.affine_inverse()
return Vector3(
xform.basis[0].dot(global_position) + xform.origin.x,
xform.basis[1].dot(global_position) + xform.origin.y,
xform.basis[2].dot(global_position) + xform.origin.z
)
Thanks for the answer. I will try it later.
PiCode | 2023-03-21 18:05