Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
  • Help Room /
avatar image
0
Question by osamaamir · Mar 09, 2020 at 11:46 AM · c#camerarotationmathfclamp

how do i Limit camera rotation on Y-Axis

Hello


I have a problems with (Mathf.Clamp) for camera Y axis. This is a simple camera controller script, everything is good the code work too, but the problem is when i try to use (Mathf.Clamp) for Y axis the camera automatic rotating !! pls what should i do ?? this is a code of script. i need another way to limit camera rotation on Y-Axis!!


 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class camera_follow : MonoBehaviour {
 
     [Header("Target")]
     public Transform    target;
     public float        distance = 3.5f;
 
     [Header("Camera speeds")]
     public float follow_speed   = 20f;
     public float y_sensitivity  = 1f;
     public float x_sensitivity  = 1f;
     
     [Header("Axis")]
     public float    y_max_axis = 2f;
     public float    y_min_axis = 0.1f;
 
     // Other private variables
     private Vector3 offset;
     private Vector3 direction;
     private float x_axis;
     private float y_axis;
 
     // Start
     void Start() {
         offset = target.position * distance;
     }
 
     // Update
     void Update() {
         // Get axis of X & Y using mouse
         x_axis = Input.GetAxis("Mouse X") * x_sensitivity;
         y_axis = Input.GetAxis("Mouse Y") * y_sensitivity;
 
         // Clamp Y axis
         // there will be no any problem if i disable this clamp
         //y_axis = Mathf.Clamp(y_axis, y_min_axis, y_max_axis);
     }
 
     // Fixed update
     void FixedUpdate() {
         // Offset
         offset = Quaternion.AngleAxis(y_axis, Vector3.right) * Quaternion.AngleAxis(x_axis, Vector3.up) * offset;
 
         // Set direction of target
         direction = target.position + offset * distance;
 
         // Trans & Look
         transform.position = Vector3.Lerp (transform.position, direction, follow_speed * Time.deltaTime);
         transform.LookAt(target.position);      
     }
 }
 

Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image tormentoarmagedoom · Mar 09, 2020 at 11:54 AM 0
Share
 you can just do
 
 if position.x> something
 position.x = something

1 Reply

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by streeetwalker · Mar 09, 2020 at 01:53 PM

HI Osama! The problem is that when you don't move the mouse y_axis is zero. But you're clamping it between your min and max,

Therefore, when y_axis = 0, the camp returns your min value and you get constant rotation at that value. You want to limit the resulting angle based on y_axis, so clamp that, not y_axis.

@osamaamir You're using Quaternions already, you just need to make sense of them - and I'm still learning!

You got me going on this quest to build the perfect follower script. it is not complete yet. It doesn't do any "animation" of the camera - the camera is always the same relative distance from the player. I'm working now to limit the camera orbit angles, and also to do a spring like player-camera distance, so you get a little lag in the camera position when as move the player and the camera speed sup a little as it catches up

Create a new project, put a cube (the "player") and a camera in the scene and place this script on the camera, and the second script on the cube. Position the camera a few meters away from the cube. Put some ground and other objects so you have a visual reference when you move around.

Use ASWD to move and rotate the cube. In this script you have to drag to orbit the camera. Read the code comments.

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class CameraFollow : MonoBehaviour {
     public Transform target;
     public float distance = 3.5f; // not yet
     public float y_sensitivity = 1f;
     public float x_sensitivity = 1f;
     public float y_max_axis = 2f; // not implemented yet
     private Vector3 offset;
     private float pitch, yaw;
     private Quaternion oldRotation;
     private bool dragging = false;
 
     void Start() {
         GameObject g = gameObject;
         // to do: positon game object using distance
         transform.LookAt( g.transform ); // start out focusing on object
 
         // record these for use later
         offset = transform.position - target.position;
         oldRotation = target.transform.rotation;
         
     }
 
     // Update
     void Update() {
         // Get axis of X & Y using mouse to use when we
         // orbit the mouse around the object
         // here we are making the user left click and drag
         // if you want free movment without dragging, delete all the mousedown code
         if( Input.GetMouseButtonDown( 0 ) ) {
             dragging = true;
         }
 
         if( Input.GetMouseButtonUp( 0 ) ) {
             dragging = false;
         }
 
         if( Input.GetMouseButton( 0 ) && dragging ) {
             // to do: check if angles are between max or min, if not don't allow input
             yaw = Input.GetAxis( "Mouse X" ) * x_sensitivity;
             pitch = Input.GetAxis( "Mouse Y" ) * y_sensitivity;
         }
     }
 
     void FixedUpdate() {
         // only update if input was made
         if( Mathf.Abs(pitch - yaw) > 0.001f  ) {
             // rotate around is much easier - Quaternions do it for you
             transform.RotateAround( target.position, Vector3.up, yaw );
             transform.RotateAround( target.position, -transform.right, pitch );
             // update the offset positon if we have orbited the camera
             offset = transform.position - target.position;
         }
         // only update if we have rotated our player
         if( Quaternion.Dot( target.rotation, oldRotation ) <= 1f - 0.000001f ) {
             // get the change in rotation
             Quaternion deltaQ = target.rotation * Quaternion.Inverse( oldRotation );
             oldRotation = target.rotation;
             // apply rotation to camera offset location and rotation
             offset  =  deltaQ  * offset ;
             transform.rotation =  deltaQ * transform.rotation;
         }
         // finally, apply all the changes to the camera
         transform.position = target.position + offset;
     }
 }



cube "player" script:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class MovePlayer : MonoBehaviour
 {
     public float speed = 0.05f;
 
     // Update is called once per frame
     void Update()
     {
         if( Input.GetKey( KeyCode.A ) ) {
             float angle = transform.eulerAngles.y + 1;
             transform.rotation = Quaternion.Euler( new Vector3( 0, angle, 0 ) );
         } else if( Input.GetKey( KeyCode.D ) ) {
             float angle = transform.eulerAngles.y - 1;
             transform.rotation = Quaternion.Euler( new Vector3( 0, angle, 0 ) );
         }
         if( Input.GetKey( KeyCode.W ) ) {
             transform.Translate( Vector3.forward * speed );
         } else if( Input.GetKey( KeyCode.S ) ) {
             transform.Translate( Vector3.forward * -speed );
         }
     }
 }
 


Comment
Add comment · Show 7 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image osamaamir · Mar 09, 2020 at 05:32 PM 0
Share

@streeetwalker thank you for your comment. now i understand this :) but what can i do to limit camera rotation on Y axis. can you pleas fix this for me ?

avatar image streeetwalker osamaamir · Mar 09, 2020 at 07:10 PM 0
Share

@osamaamir , that is not simple, because you are dealing with Quaternions. It's not simple no matter what you have with angles!

I adapted this from this post, so I have not tested it. Look at the last reply here: https://forum.unity.com/threads/how-do-i-clamp-a-quaternion.370041/

This will do it, I think, so good luck! ;-)

You need a new function:

 private Quaternion ClampRotation(Quaternion q, float $$anonymous$$, float max)
 {
     q.x /= q.w;
     q.y /= q.w;
     q.z /= q.w;
     q.w = 1.0f;
  
     float angleY = 2.0f * $$anonymous$$athf.Rad2Deg * $$anonymous$$athf.Atan(q.y);
     angleY = $$anonymous$$athf.Clamp(angleY, $$anonymous$$, max);
     q.y = $$anonymous$$athf.Tan(0.5f * $$anonymous$$athf.Deg2Rad * angleY);
  
     return q;
 }
  
     // Then in your fixedupdate loop, before you calculate your 
     // offset rotation - $$anonymous$$Angle and maxAngle in degrees
     Quaternion tempRot = Quaternion.AngleAxis(y_axis, Vector3.right)
     Quaternion clampedRot = ClampRotation(tempRot, $$anonymous$$Angle, maxAngle);

       // Offset -- this replaces what you have
      offset = clampedRot * Quaternion.AngleAxis(x_axis, Vector3.up) * offset;
 
avatar image osamaamir streeetwalker · Mar 09, 2020 at 07:30 PM 0
Share

@streeetwalker if this not simple is there anther way to do this ? i mean without using transform.LookAt() ? and you know why i'm using this code because it's very smooth even when i set (targetFrameRate) to 30f.

Show more comments

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

792 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Rotation around player. and Camera position, 2 Answers

RTS Camera wiggle approaching to clamped borders 1 Answer

Fix rotation skipping 0 Answers

Problems with rotating the player on the Y axis C# 0 Answers

How can I stop my first person camera from going upside down? 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges