- Home /
Camera Control and Character Rotation
Hey, Sorry if this seems like a silly mistake, I've only been using Unity for about a week, and there's something here I'm just not quite grasping.
I want to use a fairly basic 3rd Person Control scheme for my game. It differs from the default one, in the sense that when the mouse is moved left or right I want the character to rotate left or right in sync with the camera. Sort of like WoW.
The simple code I'm using to rotate the character with the camera is working just fine.
if(Input.GetButton("MouseRotate")) {
_myTransform.Rotate(0, Input.GetAxis("MouseRotate") * 0.02f, 0);
}
The code for the camera is giving me some headaches though...
if(_camButtonDown)
{
_x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
_y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
RotateCamera();
}
private void RotateCamera() {
Quaternion rotation = Quaternion.Euler(_y, _x, 0);
Vector3 position = rotation * new Vector3(0.0f, 0.0f, -walkDistance) + target.position;
_myTransform.rotation = rotation;
_myTransform.position = position;
}
It's almost working as Intended, however whenever the button to rotate the camera is pressed the camera changes to an angle to the left of the character instead of from straight behind. I don't particularly understand Vectors or Quaternion's too well yet :D
This seems like a very simple variable value issue but after several hours I'm not sure what i've done. rofl :D
Answer by Tommynator · Sep 23, 2011 at 11:08 AM
Your problem is, that you are modifying your transform in two different places, without respecting the others changes.
The first part of your script is using transform.Rotate() which internally is multiplying the current rotation quaternion with the new one. But in your second part you just set the rotation equal to your new input!
Get rid of you x,y members and apply the current rotation delta in an additive way. With this snippet it will work:
if (_camButtonDown)
{
float x = Input.GetAxis("Mouse X") * xSpeed * 0.02f;
float y = -Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
RotateCamera(x, y);
}
private void RotateCamera(float x, float y)
{
_myTransform.rotation *= Quaternion.Euler(y, x, 0);
_myTransform.position = _myTransform.rotation * new Vector3(0.0f, 0.0f, -walkDistance) + target.position;
}
Cheers, Tommy
Your answer
Follow this Question
Related Questions
How to make camera position relative to a specific target. 1 Answer
Changing the Camera Control 2 Answers
Stop camera from going through walls 2 Answers
Third Person Camera Control 2 Answers
3rd person controller camera passing through walls 0 Answers