Menu
CoddyTech

קווטרניונים

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

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

אתגר

בינוני

האקדח מסתובב באמצעות החצים שמאלה וימינה, ומקש הרווח יורה קליע אחד ישר קדימה. שנה את הירי במקש הרווח כך שיירו שלושה קליעים בפריסה: אחד ישר קדימה, אחד מסובב ב־spread (20) מעלות ימינה לכיוון שאליו פונה האקדח, ואחד 20 מעלות שמאלה. הפריסה חייבת להסתובב יחד עם האקדח.

  • כל קליע פונה לכיוון משלו (הסקריפט המוכן Bullet מטיס אותו לאורך הכיוון הקדמי שלו).
  • כל קליע מתחיל במרחק של יחידה אחת ממרכז האקדח, לאורך הכיוון שלו.

לחץ על Play, הסתובב וירה, ואז לחץ על Check.

נסו בעצמכם

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);
        }
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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