- Home /
Question by
velarde101 · Jan 31, 2014 at 12:19 AM ·
rotationquaternionlocal axis
Can this be rewitten to control axis locally instead of globally?
Here is the Code:
rigidbody.rotation = Quaternion.Euler(rigidbody.velocity.z * tilt2, rigidbody.rotation.eulerAngles.y, rigidbody.velocity.x * tilt);
This code currently is controlling tilt/bank of my player controller through its rigidbody. It works great but only on global axis. Is there a way to write this code out so it gives me same control but on the local axis?
I've tried this:
rigidbody.rotation = Quaternion.Euler(transform.TransformDirection (rigidbody.velocity.z * tilt2, rigidbody.rotation.eulerAngles.y, rigidbody.velocity.x * tilt));
... No dice!
Entire code looks like:
using UnityEngine;
using System.Collections;
[System.Serializable]
public class Boundary
{
public float xMin, xMax, zMin, zMax;
}
public class PlayerController : MonoBehaviour
{
// Places specific attributes in Player Inspector
public float speed;
public float tilt;
public float tilt2;
public float RotateSpeed = 30f;
public Boundary boundary;
void FixedUpdate ()
{
// Boat X and Z axis movement
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector3 movement = new Vector3(-moveVertical, 0.0f, moveHorizontal);
movement = transform.TransformDirection(movement);
rigidbody.velocity = movement * speed;
// rigidbody.velocity.x(moveHorizontal * speed);
// rigidbody.velocity.z(moveVertical * speed);
// Restrains Boat movement
rigidbody.position = new Vector3
(
Mathf.Clamp (rigidbody.position.x, boundary.xMin, boundary.xMax),
0.0f,
Mathf.Clamp (rigidbody.position.z, boundary.zMin, boundary.zMax)
);
// Boat Tilt and Bank
rigidbody.rotation = Quaternion.Euler(rigidbody.velocity.z * tilt2, rigidbody.rotation.eulerAngles.y, rigidbody.velocity.x * tilt);
// rigidbody.rotation = Quaternion.Euler(transform.TransformDirection (rigidbody.velocity.z * tilt2, rigidbody.rotation.eulerAngles.y, rigidbody.velocity.x * tilt));
//Boat Y axis Turn/Rotation
if (Input.GetKey(KeyCode.Z))
transform.Rotate(-Vector3.up * RotateSpeed * Time.deltaTime);
else if (Input.GetKey(KeyCode.C))
transform.Rotate(Vector3.up * RotateSpeed * Time.deltaTime);
}
}
Comment
Best Answer
Answer by velarde101 · Feb 04, 2014 at 01:40 AM
Figured it out... Hopefully by posting my own answer it'll help someone else.
New Code looks like:
rigidbody.rotation = Quaternion.Euler(transform.InverseTransformDirection(rigidbody.velocity).z * tilt2, rigidbody.rotation.eulerAngles.y, transform.InverseTransformDirection(rigidbody.velocity).x * tilt);
Dueces!!
Your answer
![](https://koobas.hobune.stream/wayback/20220613132131im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Smooth rotation about global axis instead of local axis. 1 Answer
Quaternions acting up 1 Answer
Directional booster 1 Answer
Mimic other object's rotation on one axis (with offset) 0 Answers