Menu
CoddyTech

Kuaternion

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 41 dari 63.

Quaternion adalah tipe Unity untuk rotasi: transform.rotation adalah salah satunya, begitu juga nilai yang dikembalikan oleh Quaternion.Euler. Keempat angkanya, x, y, z, dan w, bukan sudut, dan kamu tidak perlu mengaturnya sendiri. Untuk mengolah rotasi, kamu mengalikannya. Rotasi yang dikalikan dengan vektor akan memutar vektor tersebut:

Vector3 a = Quaternion.Euler(0, 90, 0) * Vector3.forward;       // (1, 0, 0)
Vector3 b = Quaternion.Euler(0, 0, 45) * new Vector3(2, 0, 0);  // (1.41, 1.41, 0)
Vector3 lamp = transform.position + transform.rotation * new Vector3(0, 1, 2);

Rotasi harus berada di sebelah kiri: Vector3.forward * transform.rotation tidak bisa dikompilasi. Baris ketiga memutar offset sesuai rotasi objek itu sendiri, jadi lamp adalah titik 1 unit di atas dan 2 unit di depan objek, mengikuti arah objek itu sendiri, ke mana pun objek menghadap.

Rotasi yang dikalikan dengan rotasi akan menggabungkan kedua putaran. transform.rotation * Quaternion.Euler(0, 90, 0) menerapkan rotasi objek, lalu memutarnya seperempat putaran pada sumbu y milik objek itu sendiri. Jika urutannya dibalik, seperempat putaran terjadi pada sumbu y dunia. Untuk objek yang tegak, keduanya menghasilkan hasil yang sama. Untuk pesawat yang miring 30 derajat, hasilnya berbeda karena sumbu y-nya sendiri ikut miring:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // hidung (0.87, 0.5, 0): naik saat berbelok
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // hidung (1, 0, 0): tetap mendatar

Quaternion.identity berarti tidak ada putaran sama sekali, seperti yang kamu berikan ke Instantiate. Mengalikannya dengan nilai ini tidak mengubah apa pun, dan transform.rotation = Quaternion.identity; mengembalikan objek ke pose tanpa putaran.

challenge icon

Tantangan

Sedang

Senjata berputar dengan panah kiri dan kanan, sedangkan Space menembakkan satu peluru lurus ke depan. Ubah agar Space menembakkan tiga peluru yang menyebar: satu lurus ke depan, satu berbelok spread (20) derajat ke kanan dari arah hadap senjata, dan satu lagi 20 derajat ke kiri. Sebaran peluru harus ikut berputar bersama senjata.

  • Setiap peluru menghadap ke arahnya sendiri (script Bullet yang sudah tersedia menerbangkannya ke arah depannya).
  • Setiap peluru mulai pada jarak 1 unit dari pusat senjata, menjauh ke arah masing-masing.

Tekan Play, putar dan tembak, lalu tekan Check.

Coba sendiri

using UnityEngine;

public class Gun : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float turnSpeed = 90f;
    public float spread = 20f;

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow)) transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
        if (Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);

        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Satu peluru melaju lurus ke depan. Tembakkan tiga peluru pada sudut -spread, 0, dan spread derajat.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Fisika dan Gameplay