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
  • 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
    Commented Apr 3, 2017 at 17:07

1 Answer 1

4
\$\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)
{
    if(up == default)
      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\$
3
  • \$\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\$
    – John Smith
    Commented Apr 3, 2017 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
    Commented Apr 3, 2017 at 16:44
  • \$\begingroup\$ For future readers, if you want something almost like this but with different axes, check if this more general answer serves your needs. \$\endgroup\$
    – DMGregory
    Commented Mar 14, 2023 at 0:16

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .