Say I have 2 vectors A and B that form a plane. I would like to rotate an object so that the object’s Y axis will point in the direction of vector A, and the object’s Z axis will point in the direction of vector B. Quaternion.FromToRotation() works for aligning to one axis. I’ve tried Quaternion.FromToRotation() for each axis and then multiplying them, but that does not work. I can’t figure this one out. Any ideas?
Nevermind, I got it. Here’s my solution. I’d still like to know if there’s a better way of doing it.
void Align(Vector3 alignY, Vector3 alignZ) {
//Align Z first
transform.rotation = Quaternion.FromToRotation(Vector3.forward, alignZ);
//Get component of alignY that is in the plane YZ
alignY -= Vector3.Dot(alignY, transform.right) * transform.right;
//Get the angle needed to align Y
float angle = Vector3.Angle(transform.up, alignY);
//Fix angle sign
if (Vector3.Dot(Vector3.Cross(alignY, transform.up), transform.right) > 0.0f) {
angle *= -1.0f;
}
//For some reason this wasn't working
//transform.rotation *= Quaternion.AngleAxis(angle, transform.right);
//Align Y
transform.Rotate(transform.right, angle, Space.World);
}