گرافیک کامپیوتری به سبکِ تِرِد گرافیک کامپیوتری به سبکِ تِرِد



شما این تِرِد رو مطالعه کردید آفرین.🍻
اوپس: تصویر 502
جسی ساما 1405/6/15

ترکیب Transformation ها باهم آموزش و یادگیری ترکیب Transformation ها باهم به صورت رایگان

توی ترد قبلی دیدیم که می‌تونیم Transformation ها رو به شکل یک ماتریس نمایش بدیم.

حالا میخوایم ترکیبشون کنیم به صورت یک جا به شئ مون اعمالش کنیم.


بیاید با دو Transformation شروع کنیم

فعلاً جا به جایی رو کنار می‌ذاریم و فقط با تغییر اندازه و چرخش کار می‌کنیم:

فرض کنید یک نقطه داریم و می‌خوایم:

اول دو برابرش کنیم.

و بعد:

۹۰ درجه بچرخونیمش.

برای هر کدوم یک ماتریس داریم.

ماتریس مربوط به Scaling رو با S و ماتریس مربوط به Rotation رو با R می‌نامیم.

برای یک Uniform Scale با ضریب ۲، ماتریس ما اینه:

$$ S = \begin{pmatrix} 2 & 0 \cr 0 & 2 \end{pmatrix} $$

و برای یک Rotation برابر با ۹۰ درجه، ماتریس مربوط به چرخش اینه:

$$ R = \begin{pmatrix} 0 & -1 \cr 1 & 0 \end{pmatrix} $$

حالا فرض کنید نقطه‌ی ما این باشه:

$$ \vec{A} = \begin{pmatrix} 1 \cr 0 \end{pmatrix} $$


اول Scaling

برای اعمال Scaling، ماتریس S رو در بردار نقطه A ضرب می‌کنیم:

$$ A’ = S\vec{A} $$

یعنی:

$$ A’ = \begin{pmatrix} 2 & 0 \cr 0 & 2 \end{pmatrix} \cdot \begin{pmatrix} 1 \cr 0 \end{pmatrix} $$

حالا ضرب ماتریس در بردار رو انجام می‌دیم:

$$ A’ = \begin{pmatrix} (2)(1) + (0)(0) \cr (0)(1) + (2)(0) \end{pmatrix} $$

در نتیجه:

$$ A’ = \begin{pmatrix} 2 \cr 0 \end{pmatrix} $$

یعنی نقطه‌ی ما بعد از Scaling شده:

$$ A’ = (2,0) $$


حالا Rotation

حالا باید Rotation رو روی نتیجه‌ی Scaling اعمال کنیم.

پس:

$$ A’’ = RA' $$

یعنی:

$$ A’’ = \begin{pmatrix} 0 & -1 \cr 1 & 0 \end{pmatrix} \cdot \begin{pmatrix} 2 \cr 0 \end{pmatrix} $$

دوباره ضرب رو انجام می‌دیم:

$$ A’’ = \begin{pmatrix} (0)(2) + (-1)(0) \cr (1)(2) + (0)(0) \end{pmatrix} $$

در نتیجه:

$$ A’’ = \begin{pmatrix} 0 \cr 2 \end{pmatrix} $$

پس نقطه‌ی نهایی ما:

$$ A’’ = (0,2) $$

تا اینجا دقیقا همون کاری رو کردیم که انتظار داشتیم:

Scale –> Rotate


حالا چطوری این دو مرحله رو ترکیب کنیم؟

اینجا بخش جالب ماجرا شروع می‌شه.

ما داشتیم این عبارت ریاضی رو حل می کردیم:

$$ A’’ = R(S\vec{A}) $$

یعنی اول ماتریس S روی بردار A اعمال شد و بعد ماتریس R روی نتیجه.

حالا می‌تونیم دو ماتریس رو قبل از اعمال روی نقطه، با هم ضرب کنیم:

$$ A’’ = (RS)\vec{A} $$

ما می‌تونیم اول یک ماتریس جدید بسازیم:

$$ M = RS $$

و بعد فقط ماتریس ترکیبی M رو روی نقطه A اعمال کنیم:

$$ A’’ = M\vec{A} $$


ساختن Matrix ترکیبی

حالا بیاین ماتریس R و S رو در هم ضرب کنیم.

داشتیم:

$$ R = \begin{pmatrix} 0 & -1 \cr 1 & 0 \end{pmatrix} $$

و:

$$ S = \begin{pmatrix} 2 & 0 \cr 0 & 2 \end{pmatrix} $$

پس:

$$ M = RS $$

یعنی:

$$ M = \begin{pmatrix} 0 & -1 \cr 1 & 0 \end{pmatrix} \cdot \begin{pmatrix} 2 & 0 \cr 0 & 2 \end{pmatrix} $$

برای به‌دست آوردن هر درایه، یک سطر از ماتریس اول رو در یک ستون از ماتریس دوم ضرب و جمع می‌کنیم:

$$ M = \begin{pmatrix} (0)(2)+(-1)(0) & (0)(0)+(-1)(2) \cr (1)(2)+(0)(0) & (1)(0)+(0)(2) \end{pmatrix} $$

در نتیجه:

$$ M = \begin{pmatrix} 0 & -2 \cr 2 & 0 \end{pmatrix} $$

ماتریس M حالا نماینده‌ی هر دو Transformation ماست.

یعنی یک Scale با ضریب ۲ و بعد یک Rotation برابر ۹۰ درجه.

حالا اگر ماتریس M رو مستقیما روی نقطه اعمال کنیم:

$$ A’’ = M\vec{A} $$

داریم:

$$ A’’ = \begin{pmatrix} 0 & -2 \cr 2 & 0 \end{pmatrix} \cdot \begin{pmatrix} 1 \cr 0 \end{pmatrix} $$

که نتیجه می‌شه:

$$ A’’ = \begin{pmatrix} 0 \cr 2 \end{pmatrix} $$

دقیقا همون نتیجه‌ای رو گرفتیم که با حساب کردن جداگانه‌ی ماتریس تغییر اندازه و چرخش بدست آوردیم.

و اینطوری تونستیم دو Transformation رو به یک Transformation Matrix تبدیل کنیم.


در نهایت Composition یعنی چی؟

وقتی چند Transformation رو با هم ترکیب می‌کنیم و حاصل اون‌ها رو در قالب یک ماتریس واحد نمایش می‌دیم، داریم Transform Composition انجام می‌دیم.

به عنوان مثال:

$$ M = RS $$

یعنی ماتریس M نتیجه‌ی ترکیب این دو Transformation رو در خودش داره:

Scale –> Rotate

و به‌جای اینکه هر بار دو ماتریس رو روی رأس ها اعمال کنیم، می‌تونیم ماتریس ترکیبی رو یک بار اعمال کنیم:

$$ \vec{A’} = M\vec{A} $$


اما یک نکته‌ی خیلی مهم!

ترتیب Transformation ها خیلی مهمه.

یعنی:

Scale –> Rotate

لزومـاً با:

Rotate –> Scale

یک نتیجه نمی‌ده.

چون اگر ترتیب رو عوض کنیم، ترتیب ضرب ماتریس ها هم عوض می‌شه.

برای حالت اول داشتیم:

$$ M = RS $$

اما اگه اول Rotation رو و بعد Scaling رو اعمال کنیم:

$$ M = SR $$

و در حالت کلی:

$$ RS \neq SR $$

یعنی ضرب ماتریس ها جابه‌جاپذیر نیست.


چرا ترتیب Transformation ها مهمه؟

چون ترتیب اینکه ما اول یک شئ رو بزرگ کنیم و چرخش اش بدیم… با این ترتیب که اول بیایم چرخش اش بدیم، بعد بزرگش کنیم، خیلی فرق داره و نتایج کاملا متفاوتی میده.

بیایید یک مثال ساده ببینیم.

فرض کنید یک نقطه داریم به نام A:

$$ \vec{A} = \begin{pmatrix} 1 \cr 0 \end{pmatrix} $$

و می‌خوایم روی اون دو Transformation انجام بدیم:

یک Scale غیر یکنواخت

که مقدار X رو دو برابر می‌کنه:

$$ S = \begin{pmatrix} 2 & 0 \cr 0 & 1 \end{pmatrix} $$

و یک Rotation 90 درجه:

$$ R = \begin{pmatrix} 0 & -1 \cr 1 & 0 \end{pmatrix} $$

حالا دو حالت مختلف داریم.

  1. Scale → Rotate

اول Scale می‌کنیم:

$$ \begin{pmatrix} 2 \cr 0 \end{pmatrix} $$

بعد Rotation:

$$ \begin{pmatrix} 0 \cr 2 \end{pmatrix} $$

پس نتیجه می‌شه:

$$ \boxed{(0,2)} $$

حالا ترتیب رو عوض کنیم:

  1. Rotate → Scale

اول Rotation:

$$ \begin{pmatrix} 0 \cr 1 \end{pmatrix} $$

و بعد Scale:

$$ \begin{pmatrix} 0 \cr 1 \end{pmatrix} $$

این بار نتیجه می‌شه:

$$ \boxed{(0,1)} $$

می‌بینیم که فقط با عوض کردن ترتیب Transformation ها، نقطه به جای اینکه به موقعیت (0,2) برسه به موقعیت (0,1) رسیده.

از دید ماتریس ها هم همین اتفاق رو می‌بینیم.

در حالت اول:

$$ M = RS $$

و در حالت دوم:

$$ M = SR $$

حل ماتریس اولی:

$$ \begin{pmatrix} 0 & -1 \cr 2 & 0 \end{pmatrix} $$

حل ماتریس دومی:

$$ \begin{pmatrix} 0 & -2 \cr 1 & 0 \end{pmatrix} $$

پس:

$$ RS \neq SR $$

یعنی ضرب ماتریس ها جابه‌جاپذیر نیست.

بنابراین:

  1. Scale → Rotate

و

  1. Rotate → Scale

دو Transformation متفاوت هستند.

به همین دلیل وقتی چند Transformation رو با هم ترکیب می‌کنیم، باید دقیقاً بدونیم هر Transformation به چه ترتیبی اعمال می‌شه.


حالا جابه‌جایی رو چطور ترکیب کنیم؟

تا اینجا دیدیم که می‌تونیم Transformation هایی مثل Scale و Rotation رو با ضرب ماتریس‌ها با هم ترکیب کنیم.

مثل ماتریس ترکیبی M:

$$ M = RS $$

و ضربش با نقطه A:

$$ \vec{A’} = M\vec{A} $$

اما برای جا به جایی(Translation) با یک مشکل مواجه می‌شیم.

ما جا به جایی رو این‌طوری انجام می‌دادیم:

$$ \vec{A’} = \vec{A} + \vec{T} $$

یک بردار رو با موقعیت نقطه مون جمع می کردیم.

یعنی به‌جای ضرب یک ماتریس در یک بردار، یک بردار رو به یک نقطه یا بردار دیگه اضافه می‌کردیم.

پس نمی‌تونیم جا به جایی رو به همون شکلی که برای Scale و Rotation انجام دادیم، وارد زنجیره‌ی ماتریس ها کنیم.

مثلاً نمی‌تونیم بنویسیم:

$$ M = TRS $$

چون جا به جایی T در اینجا باید بتونه به عنوان یه ماتریس قابل ارائه باشه، در حالی که جا به جایی ما فقط به شکل یک بردار میتونه تعریف بشه و نمیتونیم به عنوان یه ماتریس نمایش اش بدیم.

پس یه سؤال مهم به وجود میاد:

چطور می‌تونیم جا به جایی رو هم به شکل یک ماتریس نمایش بدیم تا بتونیم اون رو با بقیه‌ی Transformation ها ترکیب کنیم؟

برای حل این مشکل باید نحوه‌ی نمایش مختصات‌مون رو کمی تغییر بدیم.

اینجاست که مفهوم مختصات همگن(Homogeneous Coordinates) وارد مسئله می‌شه.

توی ترد بعدی می‌بینیم مختصات همگن دقیقاً چطور این مشکل رو حل می‌کنن.

شماره تِرِد : شماره 9 از 10

نظرات