Jamshaid Alam
Jamshaid Alam

Reputation: 527

How to clamp camera in Unity3D

My code is not working, I am trying to clamp the camera, but its not working. How to clamp the camera?

using UnityEngine;
using System.Collections;

public class MoveCamera : MonoBehaviour 
{

    public float sensitivity = 4.0f;        
    private Vector3 mouseOrigin;
    private bool isRotating;

    private float speed = 2.0f;

    private float minX = -45.0f;
    private float maxX = 45.0f;

    private float minY = -10.0f;
    private float maxY = 10.0f;

    float rotationY = 0.0f;
    float rotationX = 0.0f;

    void Update () 
    {
            if (Input.GetMouseButtonDown (0)) {

                mouseOrigin = Input.mousePosition;
                isRotating = true;
            }

            if (!Input.GetMouseButton (0))
                isRotating = false;

            if (isRotating) {

                Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin);
                transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity);
                transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity);

                rotationY = Mathf.Clamp (rotationY, minY, maxY);
                rotationX = Mathf.Clamp (rotationX, minX, maxX);
                transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
            }
    }
}

Upvotes: 0

Views: 5088

Answers (3)

Jamshaid Alam
Jamshaid Alam

Reputation: 527

OK, So I fixed it. Here is complete code.

using UnityEngine;
using System.Collections;

public class MoveCamera : MonoBehaviour 
{

    public float sensitivity = 4.0f;        
    private Vector3 mouseOrigin;
    private bool isRotating;
    public GameObject cam;

    void Start()
    {
    }

    protected float ClampAngle(float angle, float min, float max) {

        angle = NormalizeAngle(angle);
        if (angle > 180) {
            angle -= 360;
        } else if (angle < -180) {
            angle += 360;
        }

        min = NormalizeAngle(min);
        if (min > 180) {
            min -= 360;
        } else if (min < -180) {
            min += 360;
        }

        max = NormalizeAngle(max);
        if (max > 180) {
            max -= 360;
        } else if (max < -180) {
            max += 360;
        }

        return Mathf.Clamp(angle, min, max);
    }

    protected float NormalizeAngle(float angle) {
        while (angle > 360)
            angle -= 360;
        while (angle < 0)
            angle += 360;
        return angle;
    }


    void Update () 
    {

        if (Input.GetMouseButtonDown (0)) {

            mouseOrigin = Input.mousePosition;
            isRotating = true;
        }

        if (!Input.GetMouseButton (0))
            isRotating = false;

        if (isRotating) {

            cam.transform.localEulerAngles = new Vector3(0, ClampAngle(cam.transform.localEulerAngles.y, -45, 45), 0);
            Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin);
            transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity);
            transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity);
        }
    }
}

Upvotes: 0

Hellium
Hellium

Reputation: 7356

You forgot to get the value of rotationX and rotationY from your transform after rotating it. Try this :

if (isRotating) {

    Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin);
    transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity);
    transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity);

    rotationY = Mathf.Clamp (transform.localEulerAngles.y, minY, maxY);
    rotationX = Mathf.Clamp (transform.localEulerAngles.x, minX, maxX);
    transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
}

Upvotes: 2

user2299169
user2299169

Reputation:

Here's the code of Mathf.Clamp

public static float Clamp(float value, float min, float max) {
    if (value < min) {
        value = min;
    } else if (value > max) {
        value = max;
    }
    return value;
}

Use an IL reverse tool such as (EXTERNAL LINK)ILSPY if you are unsure how a call works in .NET (Unity / Mono / etc).
Based on the code you posted and understanding Mathf.Clamp should work as intended, the issue is most probably laying in your code, at least at one point, e.g. here:


rotationY = Mathf.Clamp (rotationX, minY, maxY); //note it's rotation "X" instead of "Y"
rotationX = Mathf.Clamp (rotationX, minX, maxX);

If this still did not sort out the issue, use Debug.Log to see variable values to find where you make the mistake(s).
If you can't sort out like this, you'll have a clear picture what exactly you can't do and can post a much cleaner question and expect a clean answer.

Hope this helps!

Upvotes: 0

Related Questions