Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 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 /
avatar image
0
Question by Supershandy · Apr 12, 2015 at 07:45 PM · rotationjavascripteuler

transform.eulerAngles Problem

Hey everyone, got a bit of a wierd issue.

I have my player object set up so that when it hits a trigger, it will flip 180 degrees of its current angle to face in the opposite direction, The triggers are responding in the debug console to show that they have been triggered, however, it only seems to change the direction of the object if the rotation of the y angle is 0 or 270, when it is 90 or 180 it just sails straight through the trigger instead of turning around.

It's a bit strange since the colliders have the same tag which is recorded in the Debug log and the colliders are the same as the ones that are north and west of the object, so why does it not work for the east and south colliders.

Here is my code

  #pragma strict
  var player : GameObject;
  var playerPoint : GameObject;
  var pressed : boolean;
  var startPosition : Vector3;
  function Start () {
  }
  function Update () 
  {    
      startPosition = playerPoint.transform.position;
      if (pressed == true)
      {
          player.transform.Translate (0, 0.2, 0);
      }
      if (pressed == false && player.transform.position !=

startPosition) { Return(); player.transform.Translate (0, 0.2, 0); } }

  function Return()
  {    
      if (player.transform.eulerAngles.y == 0) // This works
      {
          player.transform.eulerAngles.y = 180;
          //player.transform.Translate (0, 0.2, 0);
      }
      if (player.transform.eulerAngles.y == 90) // This doesn't work
      {
          player.transform.eulerAngles.y = 270;
          //player.transform.Translate (0, 0.2, 0);
      }
      if (player.transform.eulerAngles.y == 180) // This doesn't work
      {
          player.transform.eulerAngles.y = 0;
          //player.transform.Translate (0, 0.2, 0);
      }
      if (player.transform.eulerAngles.y == 270) //This works
      {
          player.transform.eulerAngles.y = 90;
          //player.transform.Translate (0, 0.2, 0);
      }
      if (player.transform.position.x == startPosition.x && player.transform.position.z == startPosition.z)
      {
          player.transform.Translate (0, 0, 0);
          player.transform.position = startPosition;
      }
  }

Any ideas as to why this is?

Cheers

Comment
Add comment
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

2 Replies

· Add your reply
  • Sort: 
avatar image
1

Answer by danielapix · Apr 12, 2015 at 09:30 PM

"Only use this variable to read and set the angles to absolute values. Don't increment them, as it will fail when the angle exceeds 360 degrees. Use Transform.Rotate instead." http://docs.unity3d.com/ScriptReference/Transform-eulerAngles.html Try to use Transform.Rotate. It's easier to use too.

Comment
Add comment · Show 3 · 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 Matheuz · Apr 12, 2015 at 10:23 PM 0
Share

Also, if you are using a CharacterController script, remember it controls the rotation too.

avatar image Supershandy · Apr 13, 2015 at 02:42 AM 0
Share

Already looked at the script reference and tried setting the angles as as (90,90, 0) and (90, 270, 0)...that made things worse as nothing worked at all after doing that

avatar image Supershandy · Apr 13, 2015 at 02:42 AM 0
Share

And i'm not using a character controller either

avatar image
0

Answer by Shiver · Apr 12, 2015 at 09:30 PM

There might be a few things.

First, you are doing equality comparisons with floats. That's usually a huge source of errors due to floating point numbers usually not giving exact numbers (you might be 269.99999998 rather than 270). It's usually best to do a range comparison with floats. Something like :

 float epsilon = 0.000001f;
 if(val < target + epsilon && value > target - epsilon)
 {
     //do something
 }

you might want to have some form of static function in a utility class somewhere for doing this

 public const float EPSILON = 0.000001f;
 static public bool EqualsWithEpsilon(float val, float equalsTo)
 {
     return val < equalsTo + EPSILON && value > equalsTo - EPSILON;
 }

If that doesn't handle the problem, my other theory is that the Euler angles are playing tricks on you. I had a problem with Euler angles myself because setting EulerAngles.x to 180 actually rotates y and z instead (same rotation effect but the values weren't what I was expecting). This caused the Euler angles to have a different value when read than the last value I had set them to (this is due to 3D rotation being a 4D operation. You need an axis (3D) and an angle (additional 1D) to compute a proper 3D rotation). You might want to save the working rotation as a float somewhere or perhaps use an enum for specifying going UP, DOWN, LEFT, RIGHT. Basically, as a rule of thumb, you should only set rotations using EulerAngles (write to). Not get from them (read from).

Comment
Add comment · Show 2 · 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 Supershandy · Apr 13, 2015 at 02:41 AM 0
Share

So perhaps setting the transformDirection Vector3.forward might be a better way of doing it?

avatar image saschandroid · Apr 13, 2015 at 06:27 AM 0
Share

Sounds like a 'Gimbal lock' problem: [http://answers.unity3d.com/questions/573035/avoiding-gimbal-lock.html][1]

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

20 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

Related Questions

transform.eulerAngles Problem 0 Answers

Rotate Gameobject on Z axis only (.JS) 1 Answer

Turret on Tank rotating fine until I'm not flat on ground 1 Answer

Why is Quaternion.Eular only rotating in one direction? [Answered] 1 Answer

Rotate a cube by 90 degree 1 Answer


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