Menu
CoddyTech

זוויות אוילר

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

transform.eulerAngles הוא סיבוב של אובייקט כשלוש זוויות במעלות, סביב x, y ו-z. Unity שומרת את הסיבוב כקווטרניון (בשיעור הבא) ומחשבת מחדש את שלוש הזוויות בכל פעם שקוראים אותן, תמיד כערכים מ-0 עד 360. הטה קרש ב-10- מעלות סביב z וקרא את הערך בחזרה:

transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z);   // 350

הגדרת 10-, אבל הקוד קורא 350, ולכן if (transform.eulerAngles.z < -5) לעולם לא יהיה true. הקריאה של הערכים בחזרה עשויה לשנות את כל שלושת המספרים: הגדר (100, 0, 0) ותקבל בקריאה (80, 180, 180), אותה אוריינטציה בייצוג אחר. Quaternion.Euler(x, y, z) פועלת בכיוון ההפוך ומקבלת כל זווית: 10-, 350 ו-710 יוצרות את אותו הסיבוב. לכן שמור את הזווית במשתנה float משלך, שנה והגבל אותה שם, והגדר לפיה את הסיבוב כולו. נדנדה זו נוטה בעזרת החצים ונעצרת ב-20 מעלות לכל צד:

public float speed = 40f;
float tilt;

void Update()
{
    tilt += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
    tilt = Mathf.Clamp(tilt, -20f, 20f);
    transform.rotation = Quaternion.Euler(0, 0, tilt);
}

אל תשנה חלק אחד מהזוויות שקראת. transform.eulerAngles.x = 110; לא מתקמפל (CS1612, כמו עם position.x), והעתקה של eulerAngles, שינוי x והשמת העותק בחזרה מתחילים מהייצוג של Unity לזוויות. אחרי הגדרת (100, 0, 0), העותק הוא (80, 180, 180); הוסף 10 ל-x ותקבל (90, 180, 180), מה שמסובב את האובייקט בחזרה ל-90 במקום להמשיך ל-110.

challenge icon

אתגר

בינוני

מצלמת האבטחה שעל העמוד אמורה לנוע מצד לצד באופן רציף: כשהיא פונה קדימה (0 מעלות סביב y), היא פונה ימינה, ערך y גדל, במהירות speed (30) מעלות לשנייה, מסתובבת בחזרה ב-limit (45), נעה לרוחב עד -limit (-45), מסתובבת בחזרה שוב, וכך הלאה. כל הזמן היא שומרת על ההטיה כלפי מטה של tilt (20) מעלות סביב x.

לחצו על Play: קוד ההתחלה מסתובב בחזרה ב-45, אבל ב--45 הוא ממשיך להסתובב. בררו למה ותקנו את הסקריפט, ואז לחצו על Check.

נסו בעצמכם

using UnityEngine;

public class Sweep : MonoBehaviour
{
    public float speed = 30f;
    public float limit = 45f;
    public float tilt = 20f;   // מעלות כלפי מטה, סביב x
    float direction = 1f;

    void Update()
    {
        transform.Rotate(0, direction * speed * Time.deltaTime, 0, Space.World);
        float angle = transform.eulerAngles.y;
        if (angle > limit) direction = -1f;
        if (angle < -limit) direction = 1f;
    }
}
quiz iconבחנו את עצמכם

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

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