Menu
CoddyTech
flag Ar iconالعربيةdown icon

زوايا أويلر

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 40 من 63.

تمثل transform.eulerAngles دوران الكائن بثلاث زوايا بالدرجات حول المحاور x وy وz. يخزّن Unity الدوران على شكل quaternion (في الدرس التالي)، ويحسب الزوايا الثلاث مجددًا في كل مرة تقرؤها، دائمًا كقيم من 0 إلى 360. أملِ لوحًا بزاوية -10 درجات حول z ثم اقرأ قيمته:

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

لقد عيّنت -10، لكن الكود يقرأ 350، لذا فإن if (transform.eulerAngles.z < -5) لا تكون صحيحة أبدًا. وقد تتغير الأرقام الثلاثة كلها عند القراءة مجددًا: عيّن (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.

اضغط على تشغيل: تعود إلى الوراء عند 45، لكنها تواصل الدوران عند -45. اكتشف السبب وأصلح البرنامج النصي، ثم اضغط على تحقّق.

جرّب بنفسك

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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الفيزياء وأسلوب اللعب