- Home /
Question by
mrbru3 · Jun 05, 2019 at 07:43 PM ·
rotationphysicsquaternionlookrotationrotatetowards
Rotate object towards another object without using the local Y axis
I have a spaceship and I want it to rotate towards another object but without using the local Y axis. I only want the ship to be able to tilt left and right(local Z axis) and rotate up and down(local X axis). I don't want the ship to rotate using the local Y (which is what it is currently doing).
Basically I want my ship to rotate like this:
NOT like this (which is what it is currently doing):
I am using this code:
Quaternion desiredRotation = Quaternion.RotateTowards(transform.rotation, QuaternionLookRotation(otherObject.transform.position - transform.position, Vector3.forward), 180); //kinda messy but it does work except for the fact that its rotating on the wrong axis
//magical code from http://digitalopus.ca/site/pd-controllers/
float kp = (6f * frequency) * (6f * frequency) * 0.25f;
float kd = 4.5f * frequency * damping;
float dt = Time.fixedDeltaTime;
float g = 1 / (1 + kd * dt + kp * dt * dt);
float ksg = kp * g;
float kdg = (kd + kp * dt) * g;
Vector3 x;
float xMag;
Quaternion q = desiredRotation * Quaternion.Inverse(transform.rotation);
q.ToAngleAxis(out xMag, out x);
x.Normalize();
x *= Mathf.Deg2Rad;
Vector3 pidv = kp * x * xMag - kd * rb.angularVelocity;
Quaternion rotInertia2World = rb.inertiaTensorRotation * transform.rotation;
pidv = Quaternion.Inverse(rotInertia2World) * pidv;
pidv.Scale(rb.inertiaTensor);
pidv = rotInertia2World * pidv;
rb.AddTorque(pidv);
I'm pretty sure all I would have to do to make this work is to change what the desiredRotation variable is equal to. But I don't fully understand quaternions well enough and I've tried multiple possibilities. If anyone could help with this it would be greatly appeciated :)
ezgifcom-optimize-1.gif
(470.2 kB)
ezgifcom-optimize-2.gif
(370.1 kB)
Comment