اگر با راینو یا گرسهاپر کار کرده باشید، احتمالاً بارها با منحنیها، سطوح و فرمهایی روبهرو شدهاید که در ظاهر فقط یک خط نرم یا یک سطح ساده هستند. اما پشت همین فرمهای ساده، یک ساختار ریاضی بسیار دقیق وجود دارد. یکی از مهمترین این ساختارها NURBS است.
NURBS مخفف عبارت Non-Uniform Rational B-Spline است. این سیستم در نرمافزارهایی مثل Rhino نقش بسیار مهمی دارد، چون بسیاری از منحنیها و سطوح دقیق با همین روش تعریف و محاسبه میشوند.
برای درک NURBS لازم نیست از همان ابتدا وارد فرمولهای پیچیده شویم. اگر پنج مفهوم اصلی آن را بهدرستی بشناسیم، بخش بزرگی از ساختار NURBS قابل فهم خواهد بود:
Degree، Control Points، Weights، Knots و فرمول اصلی منحنی.
Degree یا درجه منحنی
Degree مشخص میکند منحنی از نظر ریاضی چه درجهای دارد و نحوه رفتار آن چقدر نرم یا پیچیده است.
برای مثال، منحنی درجه ۱ رفتاری خطی دارد و بیشتر شبیه مجموعهای از قطعات مستقیم عمل میکند. منحنی درجه ۲ نرمتر است و منحنی درجه ۳ که به آن Cubic هم گفته میشود، یکی از رایجترین انواع منحنی در مدلسازی سهبعدی است.
در بسیاری از منحنیهای راینو Degree برابر 3 است.
برای مثال:
Degree: 3
به این معنی است که منحنی ما یک منحنی NURBS درجه ۳ است.
البته بیشتر بودن Degree همیشه به معنی بهتر بودن منحنی نیست. در بسیاری از مدلسازیهای صنعتی و معماری، Degree 3 ترکیب بسیار مناسبی از نرمی، کنترلپذیری و سادگی را ایجاد میکند.
Control Points یا نقاط کنترل
Control Pointها شاید ملموسترین بخش NURBS باشند.
وقتی در راینو یک منحنی را انتخاب میکنیم و نقاط کنترل آن را روشن میکنیم، همان نقاطی که اطراف منحنی دیده میشوند Control Point هستند.
این نقاط تعیین میکنند منحنی چه شکلی داشته باشد.
نکته مهم این است که منحنی معمولاً از تمام این نقاط عبور نمیکند. بلکه این نقاط مانند یک چارچوب یا اسکلت عمل میکنند و منحنی بر اساس موقعیت آنها شکل میگیرد.
اگر یکی از Control Pointها را جابهجا کنیم، فرم منحنی نیز تغییر میکند.
به همین دلیل در طراحی پارامتریک، Control Pointها اهمیت زیادی دارند. ما در واقع بهجای ویرایش مستقیم خود منحنی، نقاطی را کنترل میکنیم که فرم منحنی از آنها ساخته میشود.
Weights یا وزن نقاط
هر Control Point میتواند یک مقدار Weight یا وزن داشته باشد.
Weight مشخص میکند هر نقطه با چه قدرتی بر شکل منحنی تأثیر بگذارد.
برای مثال اگر سه نقطه داشته باشیم:
P0 → Weight = 1
P1 → Weight = 1
P2 → Weight = 3
نقطه P2 نسبت به دو نقطه دیگر تأثیر بیشتری روی منحنی خواهد داشت.
در نتیجه منحنی بیشتر به سمت آن کشیده میشود.
میتوان Weight را نوعی قدرت تأثیر هر Control Point در نظر گرفت.
این بخش یکی از دلایل مهم وجود کلمه Rational در نام NURBS است. استفاده از وزن باعث میشود NURBS بتواند بعضی فرمهای هندسی مانند دایره و قوس را با دقت بسیار بالا نمایش دهد.
در بسیاری از منحنیهای معمولی تمام Weightها برابر 1 هستند. اما در منحنیهای Rational ممکن است وزن بعضی نقاط متفاوت باشد.
Knots یا گرهها
Knots یکی از بخشهایی هستند که در ابتدا ممکن است کمی نامفهوم به نظر برسند.
Knotها نقاط هندسی نیستند و مختصات X، Y و Z ندارند.
در واقع Knotها مجموعهای از اعداد هستند که ساختار پارامتریک منحنی را مشخص میکنند.
برای مثال ممکن است یک Knot Vector به شکل زیر داشته باشیم:
0, 0, 0, 0.5, 1, 1, 1
به این مجموعه اعداد Knot Vector گفته میشود.
برای درک سادهتر، فرض کنید منحنی دارای یک پارامتر به نام
u باشد.این پارامتر معمولاً در یک بازه مشخص حرکت میکند، مثلاً:
u = 0 تا u = 1
با تغییر مقدار
u، روی نقاط مختلف منحنی حرکت میکنیم.Knotها تعیین میکنند Control Pointها در بخشهای مختلف این فضای پارامتریک چگونه و تا چه اندازه روی منحنی اثر داشته باشند.
بنابراین Knot را میتوان نوعی ساختار داخلی برای تقسیمبندی و کنترل رفتار منحنی در طول پارامتر آن دانست.
پارامتر u چیست؟
برای فهم فرمول NURBS، ابتدا باید مفهوم پارامتر
u را بشناسیم.فرض کنید یک منحنی داریم و میخواهیم موقعیت نقاط مختلف روی آن را محاسبه کنیم.
بهجای اینکه مستقیماً مختصات X، Y و Z را وارد کنیم، یک عدد به نام
u به منحنی میدهیم.برای مثال:
u = 0
u = 0.25
u = 0.5
u = 0.75
u = 1
هرکدام از این مقادیر میتوانند موقعیت خاصی را روی منحنی مشخص کنند.
پس میتوان گفت
u یک پارامتر است که با تغییر آن، در طول منحنی حرکت میکنیم.فرمول اصلی NURBS
فرمول اصلی یک منحنی NURBS به شکل زیر نوشته میشود:
C(u)=∑Ni(u)WiPi∑Ni(u)WiC(u)= \frac{ \sum N_i(u)W_iP_i }{ \sum N_i(u)W_i }
در نگاه اول ممکن است فرمول پیچیده به نظر برسد، اما اگر اجزای آن را جداگانه بررسی کنیم، مفهوم آن بسیار سادهتر میشود.
C(u) نقطهای است که در پارامتر u روی منحنی به دست میآید.P_i همان Control Pointها هستند.W_i وزن هر Control Point است.و
N_i(u) تابعی به نام Basis Function است.Basis Function چیست؟
Basis Function یکی از مهمترین بخشهای محاسبات NURBS است.
این تابع مشخص میکند در یک مقدار مشخص از
u، هر Control Point چقدر باید روی نقطه نهایی منحنی تأثیر داشته باشد.به بیان ساده، همه Control Pointها همیشه به یک اندازه روی تمام قسمتهای منحنی اثر نمیگذارند.
مثلاً ممکن است در ابتدای منحنی، Control Pointهای اول تأثیر بیشتری داشته باشند و هرچه جلوتر میرویم، Control Pointهای بعدی وارد محاسبه شوند.
Basis Function همین میزان تأثیر را مشخص میکند.
نحوه محاسبه Basis Function نیز به Degree و Knot Vector وابسته است.
در واقع Degree، Knots و Control Points همگی با یکدیگر کار میکنند تا فرم نهایی منحنی ساخته شود.
NURBS را چطور ساده درک کنیم؟
برای آموزش مقدماتی، میتوان کل ساختار NURBS را در یک جمله خلاصه کرد:
Control Point مشخص میکند منحنی به کدام سمت حرکت کند، Weight تعیین میکند هر Control Point چه قدرتی داشته باشد، Knot مشخص میکند این تأثیر در کدام قسمت منحنی اتفاق بیفتد و Degree نحوه ترکیب و نرمی این تأثیرها را تعیین میکند.
در نهایت همه این اطلاعات وارد فرمول NURBS میشوند و موقعیت نقاط مختلف منحنی محاسبه میشود.
ارتباط NURBS با Rhino و Grasshopper
در Rhino بخش بزرگی از هندسه بر پایه NURBS ساخته شده است.
وقتی یک Curve رسم میکنیم، ممکن است در ظاهر فقط یک خط نرم ببینیم، اما نرمافزار در پشت صحنه اطلاعاتی مانند Degree، Control Points، Knots و Weightها را نگهداری میکند.
در Grasshopper نیز میتوان این اطلاعات را با برنامهنویسی استخراج کرد.
برای مثال میتوان یک Curve را وارد یک کامپوننت Python کرد و Degree، تعداد نقاط کنترل، Knotها و سایر اطلاعات آن را مشاهده کرد.
یک نمونه کد بسیار ساده:
n = Crv.ToNurbsCurve()
Info = """
Degree: {}
Points: {}
Knots: {}
Equation:
C(u)=Σ(Ni·Wi·Pi)/Σ(Ni·Wi)
""".format(
n.Degree,
n.Points.Count,
list(n.Knots)
)
این کد ابتدا Curve را به ساختار NURBS تبدیل میکند و سپس تعدادی از مهمترین اطلاعات آن را نمایش میدهد.
هدف این کد انجام محاسبات پیچیده نیست، بلکه کمک میکند هنرجو متوجه شود پشت یک Curve ساده در Rhino چه اطلاعات ریاضیای وجود دارد.
جمعبندی
NURBS در نگاه اول ممکن است یک موضوع کاملاً ریاضی و پیچیده به نظر برسد، اما ساختار آن را میتوان با چند مفهوم اصلی درک کرد.
یک منحنی NURBS مجموعهای از Control Pointها دارد. هر نقطه میتواند یک Weight داشته باشد. Degree مشخص میکند منحنی چگونه این نقاط را ترکیب کند و Knot Vector نحوه توزیع تأثیر نقاط را در فضای پارامتریک مشخص میکند.
در نهایت تمام این اطلاعات با استفاده از Basis Functionها وارد فرمول NURBS میشوند و منحنی نهایی ساخته میشود.
درک همین ساختار ساده، دید بسیار متفاوتی نسبت به مدلسازی در Rhino و طراحی پارامتریک در Grasshopper ایجاد میکند؛ چون از این مرحله به بعد، منحنی دیگر فقط یک خط روی صفحه نیست، بلکه نتیجه یک سیستم دقیق ریاضی است.

