I’m trying to create a rotation for my bikes but I’m struggling with the quaternion construction.
What I need:
- The bike rotates on its local x axis (back flips, front flips, wheelies).
- The bike steers on its local y axis.
- Rolling is not permitted so no rotation on the z axis.
- Must be a single object, no hierarchy.
I tried creating my quaternion as such:
Quaternion desiredRotation = Quaternion.Euler(flipsRotation, steeringRotation, 0);
The problem is that as I do flips and I’m at 90 degrees on the x axis the bike tries to flip on the z axis.
I tried some work around like this:
float adjustedRoll = 0;
float adjustedYaw = steeringRotation;
//adjust angles if bike is flipped
if(transform.up.y < 0)
{
adjustedRoll = 180;
adjustedYaw = 180 + steeringRotation;
}
Quaternion desiredRotation = Quaternion.Euler(flipsRotation, adjustedYaw, adjustedRoll);
This sort of works but I still get some glitches. I’m sure there is a more elegant solution to this problem.
Any ideas?
You can just lock off the angles by setting the rotation variable to zero.
E.g
Var bike : Transform;
Function Update ()
{
If (bike.up.y < 0)
{
AdjustedRoll = 180;
AdjustedYaw = 180 + steeringRotation;
bike.rotation.z = 0;
}
}
I can’t guarantee anything though as I’m currently at work and can’t test it.
I fixed my issue!
Here’s how I calculated the final rotation:
Vector3 pitchYawRoll = UtilityFunctions.GetPitchYawRollDeg(transform.rotation);
Quaternion pitchRotation = Quaternion.AngleAxis(pitchYawRoll.x, Vector3.right);
Quaternion yawRotation = Quaternion.LookRotation(steeringDirection, Vector3.up);
Quaternion desiredRotation = yawRotation * pitchRotation;
The code for GetPitchYawRollDeg(Quaternion transform) is in my other question Getting the actual object rotation on just 1 axis - Unity Answers
Lock the z rotation constraint from inspector.
i need help with something , i am trying to check if the player’s rotation is bigger or smaller than a number if it is i will end the game but if i start it it ends immediately
public class PlayerMovement : MonoBehaviour
{
public float sideWaysForce = 0.5f;
protected JoyButton joybutton;
protected JoyButtonRight joybuttonright;
public Rigidbody rb;
public float forward = 2100f;
public float sideWaysForceKEYBOARD = 0.7f;
public AudioSource backgroundMusic;
protected Brake brake;
protected Gas gas;
private float increaseVolume = 0.005f;
private float increasePitch = 0.0005f;
public float maxSpeed = 1600f;
public float minspeed = 0f;
public float minspeedmultiplier = 1.45f;
public Transform playert;
public float delay = 13f;
public void Start()
{
backgroundMusic.Play();
joybutton = FindObjectOfType<JoyButton>();
joybuttonright = FindObjectOfType<JoyButtonRight>();
gas = FindObjectOfType<Gas>();
brake = FindObjectOfType<Brake>();
}
private void Update()
{
backgroundMusic.volume += increaseVolume;
backgroundMusic.pitch += increasePitch;
if (backgroundMusic.pitch > 1)
{
backgroundMusic.pitch = 1f;
}
if (transform.rotation.eulerAngles.x> 60)
{
GameObject.Find("GameManager").SendMessage("Restart");
}
if (transform.rotation.eulerAngles.x > -60)
{
GameObject.Find("GameManager").SendMessage("Restart");
}
}
void FixedUpdate()
{
if (brake.brakeispressed)
{
forward -= 70;
}
if (gas.Gasispressed)
{
forward += 70;
}
if (forward <= 400)
{
forward = forward + 70;
}
if (joybutton.Pressed)
{
rb.AddForce(-sideWaysForce , 0, 0, ForceMode.VelocityChange);
}
if (joybuttonright.PressedRight)
{
rb.AddForce(sideWaysForce , 0, 0, ForceMode.VelocityChange);
}
if (forward > maxSpeed)
{
forward = forward = maxSpeed;
}
rb.AddForce(0, 0,forward * Time.fixedDeltaTime );
if (Input.GetKey("a"))
{
rb.AddForce(-sideWaysForceKEYBOARD, 0, 0, ForceMode.VelocityChange);
}
if (Input.GetKey("s"))
{
forward = forward - 70;
}
if (Input.GetKey("w"))
{
forward = forward + 70;
}
if (Input.GetKey("d"))
{
rb.AddForce(sideWaysForceKEYBOARD, 0, 0, ForceMode.VelocityChange);
}
if (rb.position.y < -1f)
{
restartTimerAndScore();
backgroundMusic.Stop();
}
if (rb.position.y > 3f)
{
restartTimerAndScore();
backgroundMusic.Stop();
}
if (forward < minspeed)
{
forward = forward = minspeed * minspeed;
}
}
public void restartTimerAndScore()
{
GameObject.Find("Player").SendMessage("restartTimer");
GameObject.Find("SC").SendMessage("restartscore");
FindObjectOfType<GameManager>().EndGame();
}
}