Search Unity

Question Align object to normal(raycast) - weird rotation bug

Discussion in 'Scripting' started by Der_Kevin, Sep 27, 2022.

  1. Der_Kevin

    Der_Kevin

    Joined:
    Jan 2, 2013
    Posts:
    517
    hey, i am currently working on a little treehouse builder and got some problems with aligning the wooden planks to the tree normals.

    to get the normals, i do a very simple raycast - i dont think there is anything wrong with it, just for the record:
    Code (CSharp):
    1.  
    2. if (Physics.Raycast(from, dir, out hit, Mathf.Infinity, _treeLayer))
    3.         {
    4.  
    5.                 hitpoint = hit.point;
    6.                 hitnormal = hit.normal;
    7.                 hitobject = hit.transform.gameObject;
    8.                 Debug.DrawRay(from, dir, Color.red);
    9.        
    10.         }
    and to rotate the blue object to the nomrals, i do this:

    Code (CSharp):
    1.   var newRot = Quaternion.LookRotation(Vector3.ProjectOnPlane(Vector3.up, hitnormal), hitnormal);
    2.  _objectToPlaceRoot.transform.rotation = Quaternion.Slerp(_objectToPlaceRoot.transform.rotation, newRot, RotationSpeed * Time.deltaTime);
    this is how it looks like:

    ezgif-1-9132836fe0.gif

    the problem is, that the Y rotation of the blue plank, should remain like how it was on the main tree, when it goes over to the horizontal tree part, it flips, that should not happen. any idea how?

    thanks!

    edit. i tried it with

    Code (CSharp):
    1.   var newRot = Quaternion.FromToRotation(_objectToPlaceRoot.transform.up, hit.normal) * _objectToPlaceRoot.transform.rotation;
    2. _objectToPlaceRoot.transform.rotation = Quaternion.Slerp(_objectToPlaceRoot.transform.rotation, newRot, RotationSpeed * Time.deltaTime);
    and its better. i dont get the same angle when i switch to another tree branch but... its getting there

    ezgif-3-616aa977e9.gif
     
    Last edited: Sep 27, 2022
  2. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    38,697
    Pretty sure it will be the same process you use for a character controller that walks around a small globe / planet: You actually keep the previous rotation of the object and mutate it with another rotation rather than replace it.

    Specifically look at this line in
    GravityAttractor.cs
    :

    Code (csharp):
    1. body.rotation = Quaternion.FromToRotation(localUp,gravityUp) * body.rotation;
    to see what I mean about taking current rotation and morphing it.

    In this video and source code:

     
    Der_Kevin likes this.