• 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
Question by hectorhfm · Nov 08, 2015 at 01:35 PM · c#unity5euleranglesspingimbal-lock

Spining gameObjects using eulerangles not working as intended

Hello, I'm trying to turn two different gameObjects: a tank turret around the Y-axis (horizontally) and its barrel around the X-axis (vertically) by adding both of them the following script:

 [System.Serializable]
 public class Properties
 {
      public Limit horizontalLimit = new Limit(Vector2.zero);
      public Limit verticalLimit = new Limit(Vector2.zero);
      public float speed = 0f;
 }
 public Properties properties;

(Turret's spins between [-360, 360] degrees horizontally and [0, 0] vertically and barrel, for example, between [-25, 40] degrees vertically and [0,0] horizontally)

What I have done is this method which is called in Update() one:

 private void Rotate()
 {
     float mouseX = Input.GetAxis("Mouse X");
     float mouseY = Input.GetAxis("Mouse Y");

     mouseX = Mathf.Clamp(mouseX, properties.horizontalLimit.min, properties.horizontalLimit.max);
     mouseY = Mathf.Clamp(mouseY, properties.verticalLimit.min, properties.verticalLimit.max);

     gameObject.transform.Rotate(new Vector3(mouseY, mouseX, 0) * Time.deltaTime * properties.speed);
 }

When placing running the scene the tank turret rotates perfectly and smoothly. However the tank's behaves oddly: barrel rotates around the X-axis without limits even beign clamped between a min and a max.

I've been investigating and the problem might me the Gimbal lock effect due to the use of euler angles. So I changed Rotate() method using Quaternions instead. As I'm quite new into rotations my new Rotation() method is not working properly, can you help me?

 private void Rotate()
     {        
         // Aiming point
         Vector3 direction = Input.mousePosition - gameObject.transform.position;
 
         // Rotation quaternion
         Quaternion rotation = Quaternion.LookRotation(direction);
         Vector3 eulers = rotation.eulerAngles;
 
         // Clamp the rotation to its limits
         Mathf.Clamp(eulers.x, properties.verticalLimit.min, properties.verticalLimit.max);
         Mathf.Clamp(eulers.y, properties.horizontalLimit.min, properties.horizontalLimit.max);
 
         // Perform the rotation smoothly
         gameObject.transform.Rotate(gameObject.transform.up * properties.speed * Time.deltaTime, eulers.y);
         gameObject.transform.Rotate(gameObject.transform.right * properties.speed * Time.deltaTime, eulers.x);
 }


Cheers, Héctor

Comment

People who like this

0 Show 0
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

0 Replies

· Add your reply
  • Sort: 

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.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

33 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

Related Questions

spawning coins in an endless runner. pausing function for a specific time? 1 Answer

How to move forward (towards z), ignoring any rotations? 0 Answers

How to read array json file? 0 Answers

Very strange tank turret behavior in Unity 3D 0 Answers

how to simulate a hand using IMUs ? 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