Menu
CoddyTech

קווטרניונים

חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 43 מתוך 71.

Quaternion הוא הטיפוס של Unity עבור סיבוב: transform.rotation הוא אחד כזה, וכך גם הערך שמחזירה Quaternion.Euler. ארבעת המספרים שלו, x, y, z ו-w, אינם זוויות, ואין צורך לקבוע אותם בעצמך. כשעובדים עם סיבובים, כופלים. סיבוב כפול וקטור מסובב את הווקטור:

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);

הסיבוב מופיע משמאל: הביטוי Vector3.forward * transform.rotation לא מתקמפל. בשורה השלישית, היסט מסובב בהתאם לסיבוב של האובייקט עצמו, ולכן lamp היא הנקודה שנמצאת יחידה אחת מעל ו-2 יחידות לפני האובייקט בכיוונים שלו עצמו, בלי קשר לכיוון שאליו הוא פונה.

סיבוב כפול סיבוב משלב בין שני הסיבובים. הביטוי transform.rotation * Quaternion.Euler(0, 90, 0) מחיל על סיבוב האובייקט רבע סיבוב סביב ציר ה-y שלו עצמו; אם מחליפים את הסדר, רבע הסיבוב הוא סביב ציר ה-y של העולם. עבור אובייקט זקוף, שתי האפשרויות נותנות אותה תוצאה. עבור מטוס שמוטה ב-30 מעלות הן אינן נותנות אותה תוצאה, מכיוון שציר ה-y שלו נוטה יחד איתו:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // החרטום (0.87, 0.5, 0): עולה תוך כדי פנייה
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // החרטום (1, 0, 0): נשאר בגובה קבוע

Quaternion.identity הוא היעדר מוחלט של סיבוב, וזהו הערך שהעברת אל Instantiate. כפל בו לא משנה דבר, והפקודה transform.rotation = Quaternion.identity; מחזירה את האובייקט למצבו ללא סיבוב.

challenge icon

אתגר

בינוני

גרום למקש הרווח לירות מטח של שלושה כדורים שמסתובבים עם האקדח.

  1. החלף את שורת Instantiate ב-for (int i = -1; i <= 1; i++).
  2. בתוכה, הגדר Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0);.
  3. צור כל כדור במרחק של יחידה אחת בכיוון שלו: Instantiate(bulletPrefab, transform.position + aim * Vector3.forward, aim);.

לחץ על "שחק", הסתובב וירה: שלושה כדורים מתפזרים, במרווחים של 20 מעלות. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

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))
        {
            // קליע אחד, ישר קדימה. יש לירות שלושה קליעים בזוויות של ‎-spread, 0 ו-spread מעלות.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}

כל השיעורים ביחידה פיזיקה ומשחקיות

תרגלו בעצמכם: Unity אונליין