- Home /
MouseLook - limiting horizontal rotation
This script comes with a built in Vertical rotation limitation, but how do u add horizontal rotation limit? I've tried everything and I farmed the internet but I couldn't see an updated MouseLook script solution (unity 5) Help please! :(
As you can see the last function (ClampRotationAroundYAxis) is my unsuccessful try of doing this What my addition does is well, the clamp works but when going to the max up allowed it rotates the camera for some reason
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
namespace UnityStandardAssets.Characters.FirstPerson
{
[Serializable]
public class MouseLook
{
public float XSensitivity = 2f;
public float YSensitivity = 2f;
public bool clampVerticalRotation = true;
public float MinimumX = -90F;
public float MaximumX = 90F;
public float MinimumY = -150f;
public float MaximumY = 50f;
public bool smooth;
public float smoothTime = 5f;
private Quaternion m_CharacterTargetRot;
private Quaternion m_CameraTargetRot;
public void Init(Transform character, Transform camera)
{
m_CharacterTargetRot = character.localRotation;
m_CameraTargetRot = camera.localRotation;
}
public void LookRotation(Transform character, Transform camera)
{
float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;
m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f);
m_CameraTargetRot *= Quaternion.Euler (-xRot, 0f, 0f);
if(clampVerticalRotation)
m_CameraTargetRot = ClampRotationAroundXAxis (m_CameraTargetRot);
m_CharacterTargetRot = ClampRotationAroundYAxis (m_CharacterTargetRot);
if(smooth)
{
character.localRotation = Quaternion.Slerp (character.localRotation, m_CharacterTargetRot,
smoothTime * Time.deltaTime);
camera.localRotation = Quaternion.Slerp (camera.localRotation, m_CameraTargetRot,
smoothTime * Time.deltaTime);
}
else
{
character.localRotation = m_CharacterTargetRot;
camera.localRotation = m_CameraTargetRot;
}
}
Quaternion ClampRotationAroundXAxis(Quaternion q)
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1.0f;
float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan (q.x);
angleX = Mathf.Clamp (angleX, MinimumX, MaximumX);
q.x = Mathf.Tan (0.5f * Mathf.Deg2Rad * angleX);
return q;
}
Quaternion ClampRotationAroundYAxis(Quaternion q)
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1.0f;
float angleY = 2.0f * Mathf.Rad2Deg * Mathf.Atan (q.y);
angleY = Mathf.Clamp (angleY, MinimumY, MaximumY);
q.y = Mathf.Tan (0.5f * Mathf.Deg2Rad * angleY);
return q;
}
}
}
I think it would make more sense to limit the values of xRot and yRot before turning them into quaternions.
Answer by rageingnonsense · Sep 22, 2015 at 10:29 PM
Here is a portion of code I wrote a long time ago that is derived from mouse orbit, but it has similarities to yours:
// click drag input
if(Input.GetMouseButton(0)) {
xDelta = Input.GetAxis( "Mouse X" );
yDelta = Input.GetAxis( "Mouse Y" );
} else {
if(Input.GetKey(KeyCode.UpArrow)) {
xDelta = 1;
} else if(Input.GetKey(KeyCode.DownArrow)) {
xDelta = -1;
}
if(Input.GetKey(KeyCode.RightArrow)) {
yDelta = 1;
} else if(Input.GetKey(KeyCode.LeftArrow)) {
yDelta = -1;
}
}
// click and drag
if((xDelta != 0 || yDelta != 0)) {
// code in this block is a port of MouseOrbit.js.
// I really wish I understood how it worked.
xAngle += xDelta * translateSpeed * 0.02f;
yAngle -= yDelta * (translateSpeed / 2) * 0.02f;
if(yAngle > 90) {
yAngle = 90;
} else if(yAngle < -90) {
yAngle = -90;
}
if (yAngle < -360)
yAngle += 360;
if (yAngle > 360)
yAngle -= 360;
Mathf.Clamp (yAngle, -20, 80);
transform.rotation = Quaternion.Euler(yAngle, xAngle, 0);
transform.position = transform.rotation * new Vector3(0.0f, 0.0f, -distance) + transform.parent.position;
}
Notice how yAngle is clamped? Try just clamping yRot. Not sure why the original script does not do this
Your answer
![](https://koobas.hobune.stream/wayback/20220612034005im_/https://answers.unity.com/themes/thub/images/avi.jpg)