I’m trying to limit my camera movements in order to avoid it “flipping” when you look up or down further than 90 degrees, while keeping the Up vector always pointing up.
I’m currently using the following:
// Process controls
var cdir : Vector3 = transform.rotation * Vector3.forward;
cdir = (Quaternion.AngleAxis(rotX, axisX)) * cdir;
cdir = (Quaternion.AngleAxis(rotY, Vector3.Cross(cdir, Vector3.up).normalized)) * cdir;
transform.rotation = Quaternion.LookRotation(cdir);
I would like to clamp the vertical (axisY) angle to something between -89 and 89 degrees, but I fail to find a proper way to do this. I believe it shall be easier to do this in the quaternion domain, but I don’t know how to test for this.
Cherno
May 17, 2014, 10:45pm
2
Take a look at this mouselook script.
public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F;
public float minimumX = -360F;
public float maximumX = 360F;
public float minimumY = -60F;
public float maximumY = 60F;
float rotationY = 0F;
void Update ()
{
/*
if (axes == RotationAxes.MouseXAndY)
{
float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)
{
transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
}
else
{
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
}
*/
if(Screen.lockCursor == true) {
if (axes == RotationAxes.MouseXAndY) {
float rotationX = new float();
if(transform.parent != null && transform.parent.CompareTag("Player") == true) {
rotationX = transform.parent.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.parent.transform.localEulerAngles = new Vector3(0, rotationX, 0);
transform.localEulerAngles = new Vector3(-rotationY, 0, 0);
}
else if(transform.parent != null) {
rotationX = transform.parent.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.parent.transform.localEulerAngles = new Vector3(0, rotationX, 0);
transform.localEulerAngles = new Vector3(-rotationY, 0, 0);
}
/*
else {
rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
*/
}
else if (axes == RotationAxes.MouseX) {
if(transform.parent != null) {
transform.parent.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
}
else {
transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
}
}
else {
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
}
}
}
I have been using this bit of condensed code for looking. This is also in C#
`public float updownrange = 60.0f;
float verticalrotation = 0;
public float mousesensitivity = 4.0f;
void Update ()
{
verticalrotation -= Input.GetAxis ("Mouse Y") * mousesensitivity;
verticalrotation = Mathf.Clamp (verticalrotation, -updownrange, updownrange);
Camera.main.transform.localRotation = Quaternion.Euler (verticalrotation, 0, 0)}`
This assumes the camera is a child of your character, and rotates the camera rather than your actual character. So the character collider doesn’t actually move.
using UnityEngine;
using System;
public class Orbit : MonoBehaviour
{
public Transform player;
public float turnSpeed = 4.0f;
public float offset = -13;
public Vector2 cameraRotation = new Vector2(0, 20);
void Start()
{
UpdateTransform();
}
void Update()
{
if (IsMouseDown())
{
UpdateCameraRotation();
}
UpdateTransform();
}
private void UpdateCameraRotation()
{
cameraRotation.x += Input.GetAxis("Mouse X") * turnSpeed;
cameraRotation.y -= Input.GetAxis("Mouse Y") * turnSpeed;
cameraRotation.x = Mathf.Clamp(cameraRotation.x, -180, 180);
cameraRotation.y = Mathf.Clamp(cameraRotation.y, -89, 89);
}
private void UpdateTransform()
{
var xQuaternion = Quaternion.AngleAxis(cameraRotation.x, Vector3.up);
var yQuaternion = Quaternion.AngleAxis(cameraRotation.y, Vector3.right);
var combinedQuaternion = xQuaternion * yQuaternion;
transform.position = player.position + combinedQuaternion * Vector3.forward * offset;
transform.LookAt(player.position);
}
private bool IsMouseDown()
{
return Input.GetMouseButton(0);
}
}