Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice

Rotation child object

Discussion in 'Physics' started by asics1988, Apr 15, 2020.

  1. asics1988

    asics1988

    Joined:
    Jan 20, 2020
    Posts:
    4
    I have a turret, the first part (base) rotating only by Y axis, another (gun) by X axis! When I trying to rotate base(TurretAntiMaterial) by Y axis, everything good, but if after that I'll rotate by X axis child object (TurretGun), happening some magic! Who can explain it?

    var targetPostitionY = new Vector3(target.transform.position.x,
    turret_Y_RotatePart.transform.position.y,
    target.transform.position.z);

    var targetPostitionX = new Vector3(turret_X_RotatePart.transform.position.x,
    target.transform.position.y,
    target.transform.position.z);

    // Y axis
    Vector3 directionY = targetPostitionY - turret_Y_RotatePart.transform.position;
    Quaternion rotationY = Quaternion.LookRotation(directionY);

    turret_Y_RotatePart.transform.rotation = Quaternion.Lerp(turret_Y_RotatePart.transform.rotation, rotationY, 5f * Time.deltaTime);

    // X axis
    Vector3 directionX = targetPostitionX - turret_X_RotatePart.transform.position;
    Quaternion rotationX = Quaternion.LookRotation(directionX);

    turret_X_RotatePart.transform.rotation = Quaternion.Lerp(turret_X_RotatePart.transform.rotation, rotationX, 5f * Time.deltaTime);
     

    Attached Files:

  2. AlTheSlacker

    AlTheSlacker

    Joined:
    Jun 12, 2017
    Posts:
    326
    Try this:
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. public class Aim : MonoBehaviour
    6. {
    7.     [SerializeField] GameObject target = null;
    8.     [SerializeField] GameObject turret_X_RotatePart = null;
    9.     [SerializeField] GameObject turret_Y_RotatePart = null;
    10.  
    11.     private Quaternion rotationX = Quaternion.identity;
    12.     private Quaternion rotationY = Quaternion.identity;
    13.  
    14.     void Start()
    15.     {
    16.         AimGun();
    17.     }
    18.  
    19.     void AimGun()
    20.     {
    21.         Vector3 directionToTracked = target.transform.position - turret_X_RotatePart.transform.position;
    22.         Vector3 yOrientation = new Vector3(directionToTracked.x, turret_Y_RotatePart.transform.position.y, directionToTracked.z);
    23.         rotationY = Quaternion.LookRotation(yOrientation);
    24.         float elevation = target.transform.position.y - turret_X_RotatePart.transform.position.y;
    25.         float distance = directionToTracked.magnitude;
    26.         float angle = 0;
    27.         if(distance > Mathf.Abs(elevation) && distance > 0.1f)
    28.         {
    29.             angle = Mathf.Asin(elevation / distance) * 57.2958f;
    30.         }
    31.         rotationX = Quaternion.identity * Quaternion.Euler(new Vector3(-angle, 0, 0));
    32.     }
    33.  
    34.     void Update()
    35.     {
    36.         turret_Y_RotatePart.transform.rotation = Quaternion.Lerp(turret_Y_RotatePart.transform.rotation, rotationY, 2f * Time.deltaTime);
    37.         turret_X_RotatePart.transform.localRotation = Quaternion.Lerp(turret_X_RotatePart.transform.localRotation, rotationX, 2f * Time.deltaTime);
    38.     }
    39.  
    40. }
     
  3. asics1988

    asics1988

    Joined:
    Jan 20, 2020
    Posts:
    4

    I applied your variant, this is a result. I'm really don't understand why it's happening, any ideas about rotations? also, X axis now working correctly!! but now I don't know why Y axis working wrong
     

    Attached Files:

  4. asics1988

    asics1988

    Joined:
    Jan 20, 2020
    Posts:
    4
    I GOT IT!! Here is a solution!
    Code (CSharp):
    1. void AimGun()
    2.     {
    3.  
    4. private Quaternion rotationX = Quaternion.identity;
    5.     private Quaternion rotationY = Quaternion.identity;
    6.  
    7.         if (target != null)
    8.         {
    9.          
    10.             Vector3 directionToTracked = target.transform.position - turret_Y_RotatePart.transform.position;
    11.             Vector3 yOrientation = new Vector3(directionToTracked.x, turret_Y_RotatePart.transform.position.y, directionToTracked.z);
    12.             rotationY = Quaternion.LookRotation(yOrientation);
    13.             rotationY.z = 0;
    14.             rotationY.x = 0;
    15.          
    16.  
    17.             float elevation = target.transform.position.y - turret_X_RotatePart.transform.position.y;
    18.             float distance = directionToTracked.magnitude;
    19.             float angle = 0;
    20.             if (distance > Mathf.Abs(elevation) && distance > 0.1f)
    21.             {
    22.                 angle = Mathf.Asin(elevation / distance) * 57.2958f;
    23.             }
    24.             rotationX = Quaternion.identity * Quaternion.Euler(new Vector3(-angle, 0, 0));
    25.         }
    26.  
    27. void Update()
    28.     {
    29.  
    30.         AimGun();
    31.         turret_Y_RotatePart.transform.localRotation = Quaternion.Lerp(turret_Y_RotatePart.transform.localRotation, rotationY, 2f * Time.deltaTime);
    32.         turret_X_RotatePart.transform.localRotation = Quaternion.Lerp(turret_X_RotatePart.transform.localRotation, rotationX, 2f * Time.deltaTime);
    33.     }
    34.     }