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 cyangamer1 · Aug 01, 2012 at 11:16 AM · vector3slerp

Vector3.Slerp leads to wrong axis rotation

I need some help with my character movement function. I need my character (for a 3D platformer) to smooth its turns, preferably to the point that the character runs in a perfect circle where a character would normally walk in a square. After scanning the Answers and Forums, I discovered how to use the Slerp() method to smooth rotations, but my result is always different from the results given by other users.

Whenever I start my test, my character is face-down (rotated on the X axis by 90 degrees). Also, when I press a key and release it, the character keeps moving in that same direction (probably caused by the apparent misuse of the Slerp() method).

Here's my function. I can't find anything here that would cause that, so an extra set of eyes would be very helpful. Why won't my solution work?

 //  This handles movement and rotation.
 void BasicMovement()
 {
     CharacterController controller = GetComponent<CharacterController>();
     Vector3 targetDirection;

     //  If the player is touching the ground, move normally
     if (controller.isGrounded)
     {
         //  Take input from the keyboard.
         targetDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

         //  Attempt to smooth from original direction to new direction
         moveDirection = Vector3.Slerp(moveDirection, targetDirection, 1.0f * Time.deltaTime);

         //  Multiply by the move speed and add vertical velocity
         moveDirection = (moveDirection.normalized + new Vector3(0, verticalSpeed, 0)) * moveSpeed;

         //  If the player is moving then handle rotation
         if (moveDirection != Vector3.zero)
         {
             //  use SetLookRotation to make characters face where they're going. 
             Quaternion rotation = transform.rotation;
             rotation.SetLookRotation(moveDirection);
             transform.rotation = rotation;
         }
     }

     //  Only activate gravity if the character is in the air.
     if (!controller.isGrounded)
         moveDirection.y -= gravity * Time.deltaTime;

     //  Finally, move the character, according to its frame rate
     controller.Move(moveDirection * Time.deltaTime);
 }
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

1 Reply

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

Answer by whydoidoit · Aug 01, 2012 at 12:37 PM

I think it's probably your two updates to moveDirection - you are both Slerping it then normalizing it. It would be preferable to have another variable in there so the Slerp can operate over multiple frames:

     //  Take input from the keyboard.
     targetDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

     //  Attempt to smooth from original direction to new direction
     currentDirection = Vector3.Slerp(currentDirection, targetDirection, 1.0f * Time.deltaTime);

     //  Multiply by the move speed and add vertical velocity
     moveDirection = (currentDirection.normalized + new Vector3(0, verticalSpeed, 0)) * moveSpeed;
Comment
Add comment · 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

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

6 People are following this question.

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

Related Questions

Transforming slowly 1 Answer

move object and slow down near end 1 Answer

Slerp to make the right/left side face another object 2 Answers

Interpolating along an arc. 1 Answer

Having a issue with Vector3.Slerp 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