Autor Wątek: [Pomoc C#] Kula z twarzą - toczenie obiektu ze zmianą kierunku.  (Przeczytany 892 razy)

Offline RonC

  • Użytkownik

# Październik 11, 2016, 16:07:45
Witam.
Witam jestem osobą początkująca w unity. W sumie jakieś 3 miesiące w tym roku.

Jakiś czas temu zacząłem męczyć kulę (bez skojarzeń) YT "Unity 3D: Gra "Przygody Kuli" [Beta v1.1]".
Podczas rozwijania projektu pojawia się moment kiedy nie można ruszyć do przodu.

Dotąd sterowanie kulą mi wystarczyło. Ale nie chciałem mieć kolejnego sterowania kulą więc postanowiłem
że będzie to coś w rodzaju drona o kształcie kuli obrazek http://imgur.com/a/oQWyA

Podobny kod jest w dokumentacji Unity.
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); // (x, y, z)
   
        if (rb.velocity.magnitude < MaxSpeed)
            movement = movement.normalized * Acceleration * Time.deltaTime;

        rb.AddForce(movement);

Początkowo myślałem o sterowaniu w stylu czołgu ale było by to trochę uciążliwe sterowanie.
Widzę to tak jak teraz tylko żeby ta kula/dron obracał się w kierunku toczenia.
Czasem w niektórych grach  jest sterowanie myszą i wtedy widać to najbardziej.
Trochę przypomina to poruszanie się obiektem typu "cylinder" z blendera.
Myślałem o zablokowaniu osi albo rozdzieleniu Horizontal/Vertical ale mi nie wychodzi.

Doradźcie przynajmniej w jakich funkcjach szukać rozwiązania.


Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline stefanozord

  • Użytkownik

# Październik 11, 2016, 23:15:05
Ja to robie tak :

 rb.AddForce(shootDirection.normalized * forceAmount, forceMode);
 rb.AddTorque(UnityEngine.Random.onUnitSphere * 22f, ForceMode.VelocityChange);



ale wydaje mi sie ze w przypadku kuli wystarczy nadac jej sam moment obrotowy(torque), a fizyka sobie z tym poradzi sama
« Ostatnia zmiana: Październik 11, 2016, 23:21:03 wysłana przez stefanozord »

Offline RonC

  • Użytkownik

# Październik 14, 2016, 16:26:24
Siedziałem nad tym i niby się trochę posunąłem do przodu.
Poniżej moje wypociny i pomysły w komentarzach.

Zamieszczam wideo w którym widać jak to aktualnie wygląda.
https://www.youtube.com/watch?v=jyGIuVA5yAQ&feature=youtu.be

Model jak ktoś chce
https://www.dropbox.com/s/dlkl7tn8whgo2kl/testDron.fbx?dl=0

Założyłem temat na forum unity. Ponad 250 osób śledzi ten temat więc zapotrzebowanie jest.
http://answers.unity3d.com/questions/1255524/how-to-change-the-direction-of-the-model.html

    public float Acceleration = 99f;
    public float MaxSpeed = 1.5f;
    private Rigidbody rb;
    public float turnSmoothing = 15f;   // łagodniejsze obracanie

    void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate() {
 
     float moveHorizontal = Input.GetAxis("Horizontal"); 
     float moveVertical = Input.GetAxis("Vertical");

     Vector3 targetDirection = new Vector3(moveHorizontal, 0.0f, moveVertical); // (x, y, z)

      //Quaternion rotation = Quaternion.LookRotation(movement);

      Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);
      Quaternion newRotation = Quaternion.Lerp(GetComponent<Rigidbody>().rotation, targetRotation, turnSmoothing * Time.deltaTime);
       
        //Vector3 targetDirection = new Vector3(moveHorizontal, 0f, moveVertical);

        // Tworzenie obrotu oś y.
        //Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);
     
        //Quaternion newRotation = Quaternion.Lerp(GetComponent<Rigidbody>().rotation, targetRotation, turnSmoothing * Time.deltaTime);

        // Change the players rotation to this new rotation.
        //  GetComponent<Rigidbody>().MoveRotation(newRotation);
       
        if (moveHorizontal != 0f || moveVertical != 0f)
        {
         GetComponent<Rigidbody>().MoveRotation(newRotation);
            rb.AddForce(moveHorizontal,0, moveVertical);       
        }

        //  if (rb.velocity.magnitude < MaxSpeed)
        // targetDirection = targetDirection.normalized * Acceleration * Time.deltaTime;
        // rb.AddForce(newRotation);

    }

Offline Adam27

  • Użytkownik

# Październik 14, 2016, 18:57:02
Żeby to ładnie wyglądało ja bym zbudował hierarchię tak, żeby były 3 zagnieżdżone obiekty, i w każdym z nich sterowałbym rotacją w odpowiedniej osi. Najwyższy obiekt powinien kontrolować oś Y, czyli obrót w kierunku ruchu albo kamery. Drugi obiekt powinien sterować obrotem wokół lokalnej osi Z i symulować siłę odśrodkową, czyli pochylać się w zależności od prędkości i promienia skrętu (choć to na początek możesz pominąć). Natomiast Twój model powinien być podpięty do trzeciego obiektu i symulować toczenie.

Na początku pomyślałem że dałoby radę to zrobić z fizyką, ale ręcznie chyba będzie prościej, bo fizyka działa w przestrzeni globalnej i raczej ciężko byłoby kontrolować ruch i obroty w odpowiednich osiach oraz zapewnić, że model się nie przewróci.