- Home /
Problem with rigidbodies and rotation with quaternion
A weird thing is happening in my game i can't explain why. first let me put up the code so people can better understand
public class Player : MonoBehaviour
{
float moveSpeed = 25.0f;
float turnSpeed = 180.0f;
Rigidbody body;
GameObject head;
Vector3 movement;
Vector3 rotation;
Vector3 headPitch;
void Awake()
{
//headTarget = GameObject.Find("HeadTarget");
head = GameObject.Find("HeadController");
body = GetComponent<Rigidbody>();
}
void GetInput()
{
movement = new Vector3(Input.GetAxis("LeftJoyHori"), 0, Input.GetAxis("LeftJoyVert"));
rotation = new Vector3(0, Input.GetAxis("RightJoyHori"), 0);
headPitch = new Vector3(Input.GetAxis("RightJoyVert"), 0, 0);
}
void moveCharacter(Vector3 movement)
{
movement = transform.TransformDirection(movement);
body.MovePosition(transform.localPosition + movement * moveSpeed * Time.deltaTime);
}
void rotateCharacter(Vector3 rotation)
{
float newYaw = rotation.y * turnSpeed * Time.deltaTime;
Quaternion deltaRotation = Quaternion.AngleAxis(newYaw, Vector3.up);
body.MoveRotation(transform.localRotation * deltaRotation);
}
void headRotate(Vector3 pitch)
{
float newPitch = pitch.x * turnSpeed * Time.deltaTime;
Quaternion deltaRotation = Quaternion.AngleAxis(newPitch, Vector3.right);
head.GetComponent<Rigidbody>().MoveRotation(head.transform.localRotation * deltaRotation);
}
void Update()
{
GetInput();
}
void FixedUpdate()
{
moveCharacter(movement);
rotateCharacter(rotation);
headRotate(headPitch);
//headFollow(movement);
//headReturn();
}
The problem I am having is with the headRotate() function, which is supposed to only modify the pitch of the HeadController. (here is a screenshot of the hierarchy, I'm using a rigidbody for both the player and the HeadController)
when i turn up and down with my right thumbstick the HeadControllers rigidbody is supposed to turn on the x axis so it would look up and down, but for some reason when i turn the ENTIRE rigidbody starts going nuts. its SUPPOSED to turn around the y axis by turning left and right, and i don't know what i have done wrong. here is whats currently happening running the code above The problem
can someone please help me fix my code and tell me what i was doing wrong with my rotation. thank you.
Answer by Magso · Feb 27, 2020 at 09:27 AM
Firstly is the head's collider inside the body's collider? As the rigidbodies call WakeUp() it will cause them to behave erotically. Secondly in your code you're not clamping the head movement in any way. Typically looking around is done using localEulerAngles
or localRotation
without a rigidbody and the values are clamped Mathf.Clamp. This will be causing the head to spin exponentially faster.
Your answer
Follow this Question
Related Questions
Object slope rotation issue 0 Answers
Player character X rotation going haywire on game start 1 Answer
How do i rotate an object around an arbitrary axis in 3D? 0 Answers
Limit Rotation of Rigidbody to 45 Degrees (Handlebars on a Bicycle) 1 Answer
Get slerp to work just as LookAt(,Vector3.right) does 1 Answer