0
\$\begingroup\$

I use LookRotation() in order for an object to look at another, but since I'm using 2D I would like to make the axis looking/facing the target to be X instead of Z. I have the code below currently:

Vector3 dif = targetPos - obj.position;
Quaternion angle= Quaternion.LookRotation(dif, obj.up);
obj.rotation = Quaternion.Lerp(obj.localRotation, angle, Time.deltaTime);

Now->

enter image description here

What I'm trying to achieve->

enter image description here

Thanks!

\$\endgroup\$
  • 1
    \$\begingroup\$ One quick aside: the way you're using Lerp above will give different results at different framerates. If you want to rotate at a constant angular velocity, use Quaternion.RotateTowards. Or, if you want an exponential ease-out behaviour similar to what you have now but consistent at different framerates, set your interpolant to Mathf.Pow(fractionRemainingAfterOneSecond, Time.deltaTime). Also, be careful intermixing localRotation and rotation - this can give unexpected behaviour when the object has a rotated parent. \$\endgroup\$ – DMGregory Apr 3 '17 at 17:07
2
\$\begingroup\$

I've answered a few flavours of this before.

The basic idea is to chain together two rotations: one that takes the axes you want to align and points them along z+ and y+ respectively, and then the standard LookRotation to take z+ and y+ to the desired destination axes.

For a straight 3D analogue of LookRotation that positions the x+ axis instead of z+, but still treats y+ the same way as ordinary LookRotation:

Quaternion XLookRotation(Vector3 right, Vector3 up = Default(Vector3))
{
    if(up == Default(Vector3))
      up = Vector3.up;

    Quaternion rightToForward = Quaternion.Euler(0f, -90f, 0f);
    Quaternion forwardToTarget = Quaternion.LookRotation(right, up);

    return forwardToTarget * rightToForward;
}

Or, to keep an object locked in 2D with z+ forward, as in the second link above:

Quaternion XLookRotation2D(Vector3 right)
{
    Quaternion rightToUp = Quaternion.Euler(0f, 0f, 90f);
    Quaternion upToTarget = Quaternion.LookRotation(Vector3.forward, right);

    return upToTarget * rightToUp;
}
\$\endgroup\$
  • \$\begingroup\$ Thanks, I have a few questions, Will this function return the final rotation? What rotation do I put into the 'right' variable (Vector3)? \$\endgroup\$ – Vadim Tatarnikov Apr 3 '17 at 16:40
  • \$\begingroup\$ Yes. Just like the original LookRotation, this takes one or two direction vectors you want to point your object toward (so "right" is the direction you want the object's local x+ axis to point along), and returns a quaternion representing an orientation with the axes pointed the way you requested. \$\endgroup\$ – DMGregory Apr 3 '17 at 16:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.