| Pamtris User Manual(0) | Pamtris User Manual(0) |
نام (NAME)
pamtris - شطرنجیساز مثلث با درونیابی تصحیحشده از نظر پرسپکتیو برای مشخصههای عمومی رأس و بافر عمق
خلاصه دستور (SYNOPSIS)
pamtris
-width=width
-height=height
{ -num_attribs=attributes_per_vertex [ -tupletype=tupletype ] | -rgb | -grayscale }
[ -maxval=maxval ]
میتوان تمام گزینهها را به کوتاهترین پیشوند یکتای آنها مخفف کرد. میتوانید برای مشخص کردن یک گزینه، به جای یک خط تیره از دو خط تیره استفاده نمایید. میتوانید بین نام گزینه و مقدار آن از فاصله یا علامت مساوی استفاده کنید.
توضیحات (DESCRIPTION)
این برنامه بخشی از Netpbm(1) است.
برنامه pamtris را میتوان برای رسم طیف گستردهای از گرافیکهای دوبعدی و سهبعدی با ترکیب تصاویری با پیچیدگی دلخواه از مثلثهای مجزا، نوارهای مثلثی (triangle strips) و بادبزنهای مثلثی (triangle fans) استفاده کرد. این برنامه دستورالعملهای نوشتهشده در قالب یک اسکریپت دستوری ساده را از ورودی استاندارد میخواند و نتایج را به عنوان یک جریان PAM (که احتمالاً چندتصویری است) در خروجی استاندارد تولید میکند.
به عنوان مثال، ورودی زیر
mode fan attribs 0 128 0 vertex 0 0 1 attribs 0 0 128 vertex 200 0 1 attribs 50 20 103 vertex 190 61 1 attribs 100 40 78 vertex 161 117 1 attribs 150 60 53 vertex 117 161 1 attribs 200 80 28 vertex 61 190 1 attribs 250 100 3 vertex 0 200 1 print
این خروجی را تولید میکند:
نمونه خروجی pamtris برای حالت FAN
فایل ورودی، دادههای مثلث را در صورت نیاز با تنظیم حالت رسم مناسب و سپس با ارائه فهرستی از رأسها (vertices) مشخص میکند. هر رأس به فهرستی از حداکثر ۲۰ «مشخصه» (attribute) مرتبط است که مقادیر صحیح بین ۰ و یک maxval معین هستند. در متداولترین کاربرد، شما از pamtris برای رسم یک تصویر بصری استفاده میکنید و هر رأس دارای سه مشخصه است که بیانگر مقادیر RGB رنگ هستند. چنین فهرستهای مشخصهای را میتوان به ازای هر رأس ارائه داد.
پیش از نوشتن نهایی یک تصویر PAM در خروجی استاندارد، pamtris ابتدا آن را بر روی یک بافر فریم (frame buffer) داخلی شطرنجی میکند که شامل یک «بافر تصویر» (image buffer) و یک «بافر عمق» (depth buffer) است. بافر تصویر از دنبالهای از سطرهای height تشکیل شده است که حاوی دنبالهای از تاپلهای width هستند. برای هر مشخصه رأس، یک نمونه در هر تاپل به همراه یک نمونه کدر بودن (آلفا) وجود دارد. هر تاپل در بافر تصویر با یک عمق صحیح در بافر عمق نیز مرتبط است که تعیین میکند آیا عملیات رسم بعدی بر آن تاپل خاص تأثیر میگذارد یا خیر. این قابلیت روشی برای مرتبسازی عمقی (depth-sorting) اشیای گرافیکی فراهم میکند که برای بسیاری از کاربردهای گرافیک رایانهای دوبعدی و سهبعدی کفایت میکند. با این حال، یک کاستی عمده این رویکرد در مرتبسازی عمقی این است که به صورت خودکار با اشیایی که قرار است «نیمهشفاف» به نظر برسند کار نمیکند؛ بنابراین برای گنجاندن چنین اشیایی در تصاویر تولیدشده با این روش، به راهبردهای پیچیدهتری نیاز است.
نمونه کدر بودن (شفافیت)، آخرین نمونه تاپل است. برنامه pamtris شفافیت را به صورت داخلی مدیریت میکند و برای هر تاپل همیشه مقدار آن یا ۰ است یا maxval. این برنامه کنترل مستقیمی بر صفحه تصویر آلفا در اختیار کاربر قرار نمیدهد.
برنامه pamtris مثلثها را با تقریب زدن ناحیه مرئی آنها به صورت مجموعهای از تاپلها در موقعیتهای خاص در بافر فریم شطرنجی میکند، و به هر نمونه از هر تاپل، مقداری اختصاص میدهد که یک درونیابی تصحیحشده از نظر پرسپکتیو میان مقادیر مشخصه متناظر برای هر رأس مثلث است. هر زمان که تاپلی در محدوده بافر فریم تولید شود، اگر و تنها اگر در آزمون عمق (depth test) پذیرفته شود، در موقعیت متناظر در بافر فریم نوشته میشود. این آزمون به این صورت عمل میکند: مقدار عمق هر تاپل ورودی (که خود یک درونیابی میان مختصات Z رأسهای مثلث مربوطه است) با مقدار موجود در موقعیت متناظر در بافر عمق مقایسه میشود. اگر مقدار عمق تاپل ورودی برابر یا کوچکتر از مقدار عمق فعلی در آن موقعیت از بافر عمق باشد، وقایع زیر رخ میدهد:
- هر نمونه i (که در آن 0 ≤ i < num_attribs) از تاپل در موقعیت متناظر در بافر تصویر برابر با مقدار نمونه مربوطه از تاپل ورودی قرار میگیرد؛ و نمونه آلفا (آخرین نمونه) به maxval بهروزرسانی میشود؛
- مقدار عمق در موقعیت متناظر در بافر عمق به یک مقدار عمق که مستقیماً متناسب با تاپل ورودی است بهروزرسانی میگردد.
در غیر این صورت، آن تاپل خاص هیچ تغییری در بافر فریم ایجاد نمیکند.
بافر فریم در ابتدا به گونهای تنظیم میشود که تمام نمونهها در هر تاپل از بافر تصویر حاوی مقدار ۰ باشند، و تمام ورودیها در بافر عمق شامل حداکثر مقدار مجاز عمق باشند.
مقادیر مشخصهها، و بنابراین نمونهها در تصاویر PAM خروجی، هیچ تفسیر ثابتی به آنها نسبت داده نشده است (به جز آخرین صفحه تصویر، که عامدانه قرار است بیانگر اطلاعات شفافیت تاپل باشد)؛ هر کسی میتواند معنای مناسبی را به آنها نسبت دهد، مانند رنگها، مختصات بافت (texture coordinates)، بردارهای نرمال سطح، ویژگیهای برهمکنش نور، ضرایب تأثیر بافت برای بافتدهی چندگانه و غیره.
مثالها (EXAMPLES)
حالت بادبزنی (Fan Mode)
دستور زیر تصویری را از مثال حالت بادبزنی در بالای بخش توضیحات (DESCRIPTION) تولید میکند. اگر فایل fan.tris حاوی آن کد باشد، میتوانید آن را با دستور زیر پردازش کنید:
$ pamtris -height=200 -width=200 -rgb <fan.tris >fan.pam
حالت نواری (Strip Mode)
در ادامه نمونهای از حالت نواری آمده است:
mode strip attribs 255 0 0 # red vertex 0 200 1 vertex 50 0 1 attribs 0 0 0 # black vertex 100 200 1 attribs 0 205 205 # cyan vertex 150 0 1 attribs 0 0 255 # blue vertex 200 200 1 vertex 250 0 1 print
کد بالا را در فایلی به نام strip.tris (به عنوان مثال) ذخیره کنید و آن را با دستور زیر پردازش نمایید:
$ pamtris -height=200 -width=200 -rgb <strip.tris >strip.pam
تا خروجی زیر حاصل شود:
نمونه خروجی pamtris برای حالت STRIP
حالت مثلثی (Triangle Mode)
در ادامه نمونهای از حالت مثلثی آمده است:
# yellow square mode strip attrib 155 155 0 vertex 50 50 100 vertex 50 200 100 vertex 200 50 100 vertex 200 200 100 # blue triangle mode triangles attrib 0 205 205 vertex 20 125 70 attrib 0 0 140 vertex 230 70 120 # Change "120" and see what happens vertex 230 180 120 # print
کد بالا را در فایلی به نام pierce.tris (برای مثال) ذخیره کنید و با دستور زیر پردازش نمایید:
$ pamtris -height=200 -width=200 -rgb <pierce.tris >pierce.pam
تا خروجی زیر حاصل شود:
نمونه خروجی pamtris برای حالت TRIANGLES
فرابرنامهنویسی (Meta-programming)
زبان دستورات pamtris بسیار ابتداییتر از آن است که بتوان مستقیماً برای رسمهای جدی از آن استفاده کرد؛ احتمالاً ترجیح میدهید از یک زبان برنامهنویسی همهمنظوره برای تولید یک فایل دستورات موقت pamtris استفاده کنید.
به عنوان مثال، روال draw_polygon در برنامه C زیر، دستورات pamtris را برای رسم یک چندضلعی منتظم تولید میکند. این کار با ایجاد تعدادی دستور vertex در امتداد محیط دایره محیطی مربوطه انجام میشود. (توجه: تصویر PAM تولیدشده از طریق لولهکشی خروجی برنامه زیر به pamtris، متعاقباً با دستور pamscale -linear -xscale 0.25 -yscale 0.25 کوچک شد تا اثر لبههای صافشده (anti-aliased) حاصل شود.)
چندضلعیهای منتظم
/* ----------------------- * * width = 512 * * height = 512 * * num_attribs = 3 * * tupletype = RGB_ALPHA * * ----------------------- */ #include <math.h> #include <stdio.h> #include <stdlib.h> #define PI 3.14159265358979323844 void draw_polygon (int const center_x, int const center_y, int const radius, int const sides) { printf("mode fan\n" "vertex %d %d 0\n", center_x, center_y); for(int i = 0; i <= sides; i++) { int const x = round(center_x + radius * cos(i*2.0*PI / sides)); int const y = round(center_y - radius * sin(i*2.0*PI / sides)); printf("vertex %d %d 0\n", x, y); } } int main(void) { puts("attribs 0 185 80"); /* color: green */ draw_polygon(300, 210, 150, 5); /* draws pentagon */ puts("attribs 255 15 240"); /* color: magenta */ draw_polygon(150, 320, 100, 7); /* draws heptagon */ puts("!"); }
گزینهها (OPTIONS)
علاوه بر
گزینههای
مشترک در
تمام
برنامههای
مبتنی بر libnetpbm
(بهویژه
-quiet، به
گزینههای
عمومی (Common Options)
مراجعه
کنید)، pamtris
گزینههای
خط فرمان
زیر را
میشناسد:
<dl compact="compact">
- -width=width
- عرض بافر
فریم داخلی
و در نتیجه
عرض تصاویر
PAM خروجی را
بر حسب
تعداد
ستونها
تعیین
میکند. این
مقدار باید
یک عدد صحیح
در بازه
بسته [1, 8192]
باشد.
این گزینه اجباری است.
- -height=height
- ارتفاع
بافر فریم
داخلی و در
نتیجه
ارتفاع
تصاویر PAM
خروجی را بر
حسب تعداد
سطرها
تعیین
میکند. این
مقدار باید
یک عدد صحیح
در بازه
بسته [1, 8192]
باشد.
این گزینه اجباری است.
- -num_attribs=attributes_per_vertex
- تعداد
مشخصهها
به ازای هر
رأس است.
عمق تصاویر
PAM خروجی
برابر با
این مقدار
به علاوه یک
خواهد بود
(برای
اختصاص به
صفحه آلفا).
آرگومان
باید یک عدد
صحیح در
بازه بسته [1, 20]
باشد.
جریان دستورالعملهای ورودی میتواند با یک دستور reset این مقدار را تغییر دهد.
باید دقیقاً یکی از گزینههای -num_attribs، -rgb یا -grayscale را مشخص کنید.
- -tupletype=tupletype
- نوع تاپل
برای
تصاویر PAM
خروجی است.
این
آرگومان
رشتهای
است که
نباید
طولانیتر
از ۲۵۵
نویسه باشد.
جریان دستورالعملهای ورودی میتواند با یک دستور reset این مقدار را تغییر دهد.
پیشفرض یک رشته تهی است.
این گزینه نمیتواند همراه با -rgb یا -grayscale مشخص شود.
- -rgb
- این یک
گزینه
تسهیلکننده
است که
صرفاً به
عنوان یک
نام مستعار
برای -num_attribs=3
-tupletype=RGB_ALPHA عمل
میکند. به
عبارت
دیگر، این
گزینه روشی
سریع برای
مشخص کردن
این است که
قصد دارید
از pamtris برای
رسم مستقیم
تصاویر
رنگی RGB(_ALPHA)
استفاده
کنید، و سه
مشخصه رأس
عبارتند از
مقادیر
سطوح قرمز،
سبز و آبی
رنگ مرتبط
با رأس، به
همان ترتیب.
جریان دستورالعملهای ورودی میتواند با یک دستور reset این مقدار را بازنویسی کند.
باید دقیقاً یکی از گزینههای -num_attribs، -rgb یا -grayscale را مشخص کنید.
این گزینه در Netpbm 10.85 (دسامبر 2018) اضافه شد.
- -grayscale
- یک گزینه
تسهیلکننده
دیگر،
مشابه با
-rgb؛ با این
تفاوت که
این گزینه
یک نام
مستعار
برای -num_attribs=1
-tupletype=GRAYSCALE_ALPHA است.
تنها مشخصه
رأس، سطح
خاکستری
مرتبط با
رأس خواهد
بود.
جریان دستورالعملهای ورودی میتواند با یک دستور reset این مقدار را بازنویسی کند.
باید دقیقاً یکی از گزینههای -num_attribs، -rgb یا -grayscale را مشخص کنید.
این گزینه در Netpbm 10.85 (دسامبر 2018) اضافه شد.
- -maxval=maxval
- مقدار maxval
تصاویر PAM
خروجی را
تعیین
میکند، که
حداکثر
مقدار مجاز
برای هر
مشخصه رأس
نیز هست.
این مقدار
باید یک عدد
صحیح در
بازه بسته [1,
65535] باشد.
مقدار پیشفرض 255 است.
جریان دستورالعملهای ورودی میتواند با یک دستور reset این مقدار را بازنویسی کند.
کدهای دستورالعمل (INSTRUCTION CODE)
ورودی برای pamtris شامل جریانی از سطرهای متنی است که از ورودی استاندارد خوانده میشوند.
سطرهای خالی یا سطرهایی که فقط حاوی نویسههای فاصله خالی هستند، سطرهای خالی نامیده شده و نادیده گرفته میشوند.
هنگامی که علامت # در هر کجای سطر قرار گیرد، pamtris آن را به همراه تمام نویسههای پس از آن نادیده میگیرد. به عبارت دیگر، از # تا انتهای سطر همانند فاصله خالی رفتار میشود.
سطرهایی که خالی نیستند باید شامل دنبالهای از رشتهها به نام توکن (token) باشند که با فاصله خالی از یکدیگر جدا شدهاند. اولین توکن باید یکی از دستورات شناختهشده توسط pamtris باشد، و تمام توکنهای بعدی (در صورت وجود) به عنوان آرگومانهای آن دستور تفسیر میشوند. هنگامی که تعداد ناکافی از آرگومانها برای یک دستور ارائه شود، سطر نامعتبر تلقی شده و همانند یک سطر خالی با آن برخورد میشود. همین حالت زمانی رخ میدهد که آرگومانی خارج از محدوده یا از نوعی نامناسب داده شود (برای مثال زمانی که به جای مقدار عددی، رشتهای از حروف داده شود)، یا هنگامی که دستور/آرگومان ناشناختهای یافت شود. هنگامی که تعداد آرگومانها بیشتر از مقدار لازم برای یک دستور خاص باشد، تنها بخش مربوط به آخرین آرگومان مورد نیاز بررسی شده و توکنهای اضافی بعدی نادیده گرفته میشوند.
برنامه pamtris به بزرگی و کوچکی حروف حساس نیست (case-insensitive)؛ یعنی mode، MODE، mODe و غیره همگی به یک صورت پردازش میشوند.
دستورات شناختهشده توسط pamtris عبارتند از:
میتوانید از کوتاهترین پیشوند یکتای نام دستور استفاده کنید. میتوانید از علامت تعجب (!) به جای دستور print و از علامت ستاره (*) به جای clear استفاده نمایید.
عملکرد این دستورات به شرح زیر است:
- mode { triangles | strip | fan }
-
این دستور موجب ورود pamtris به یک حالت رسم جدید میشود. آرگومان یک کلمه است که حالت جدید را مشخص میکند. به جای نام کامل آرگومان، میتوان از کوتاهترین پیشوند یکتای آن استفاده کرد که همان اثر را دارد. حالت رسم تا زمانی که دستور mode بعدی صادر شود یکسان باقی خواهد ماند.
این دستور همچنین فهرست رأسهای فعلی را بازنشانی میکند، که پس از اجرای دستور در یک وضعیت خالی (مجدداً) مقداردهی اولیه میشود. میتوان با فراخوانیهای پیاپی دستور vertex (به زیر مراجعه کنید) رأسهای جدیدی به این فهرست افزود. نیازی نیست نگران ارائه «تعداد بیش از حد» رأس باشید، چرا که فهرست رأسها مجازیسازی شده است: pamtris در هر لحظه تنها وضعیت مربوط به سه رأس را حفظ میکند. فهرست رأسهای فعلی در ابتدا خالی است.
مجاز است دستوری به pamtris داده شود که به آن دستور دهد به حالت رسمی وارد شود که هماکنون در آن قرار دارد. میتوان از این رویکرد برای بازنشانی فهرست رأسهای فعلی بدون تغییر حالت رسم فعلی استفاده کرد.
صرفنظر از حالت رسم فعلی، برنامه به محض اینکه رأسهای لازم برای رسم یک مثلث جدید را از طریق فهرست رأسهای فعلی فراهم کنید، فوراً یک مثلث جدید را روی بافر فریم شطرنجی میکند. (اگر قبل از ارائه تمامی رأسهای لازم برای رسم یک مثلث جدید، فهرست رأسها را بازنشانی کنید، برنامه عملاً رأسهایی را که تا آن لحظه به فهرست اضافه شده بودند بدون استفاده از آنها برای رسم هیچ مثلث جدیدی از فهرست دور میریزد.)
در توضیحات زیر درباره هر حالت رسم، اندیسها (شمارههای ترتیبی) رأسها و مثلثها بر پایه ۰ هستند.
آرگومان triangles به pamtris دستور میدهد وارد حالت رسم "TRIANGLES" شود. در این حالت، مجموعهای از مثلثهای مجزا ساخته میشود. هر سه رأسی که به فهرست رأسهای فعلی فرستاده شوند، یک مثلث جدید را مشخص میکنند. به بیان رسمی، این بدان معناست که هر مثلث Nth توسط رأسهای 3*N، 3*N + 1 و 3*N + 2 مشخص میشود. این حالت، حالت اولیه پیشفرض است و بنابراین نیازی نیست پیش از رسم هرگونه مثلث به طور صریح تنظیم شود.
آرگومان strip به pamtris دستور میدهد وارد حالت رسم "STRIP" شود. در این حالت، pamtris یک «نوار مثلثی» میسازد؛ بدین معنی که سه رأس اول ارائهشده به فهرست رأسهای فعلی، مثلث اول را مشخص میکنند، و هر رأس جدیدی که پس از آن اضافه شود، به همراه دو رأس قبلی، مثلث بعدی را مشخص میکند. به بیان رسمی، این بدان معناست که هر مثلث Nth توسط رأسهای N، N + 1 و N + 2 مشخص میشود.
آرگومان fan به pamtris دستور میدهد وارد حالت رسم "FAN" شود. در این حالت، یک اصطلاحاً «بادبزن مثلثی» ساخته میشود؛ بدین معنی که سه رأس اول ارائهشده به فهرست رأسهای فعلی مثلث اول را مشخص میکنند، و هر رأس جدیدی که پس از آن اضافه شود، به همراه رأس قبلی و نخستین رأس، مثلث بعدی را مشخص میسازد. به بیان رسمی، این بدان معناست که هر مثلث Nth توسط رأسهای 0، N + 1 و N + 2 مشخص میشود.
- attribs a<sub>0</sub> a<sub>1</sub>
- a<sub>2</sub> ... a<sub>num_attribs -
1</sub>
این دستور فهرست مقادیر مشخصههای فعلی را بهروزرسانی میکند. این دستور به عنوان آرگومان دنبالهای از اعداد صحیح به تعداد num_attribs میگیرد که نمایانگر مقادیر مشخصههایی هستند که به رأس بعدی تخصیص مییابند. این دنباله از مقادیر همان «فهرست مقادیر مشخصههای فعلی» است که ذکر شد.
هر آرگومان ith (که در آن 0 ≤ i < num_attribs) نشاندهنده مقداری است که باید به مشخصه ith از فهرست مقادیر مشخصههای فعلی اختصاص یابد. تمام آرگومانها باید مقادیر صحیح در بازه بسته [0, maxval] باشند. اگر تعداد آرگومانهای ارائهشده کمتر از مقدار فعلی num_attribs باشد، دستور نامعتبر تلقی شده و نادیده گرفته میشود.
فهرست مقادیر مشخصههای فعلی تا زمانی که دستور معتبر بعدی attribs یا reset صادر نشود دستنخورده باقی میماند. دستور attribs امکان تغییر مقادیر هر مشخصه را به صورت مجزا فراهم میسازد، در حالی که دستور reset به طور ویژه برای این کار طراحی نشده است، اما دارای اثر جانبی تنظیم تمام مقادیر فهرست مقادیر مشخصههای فعلی به maxval است (به زیر مراجعه کنید).
تمام مقادیر موجود در فهرست مقادیر مشخصههای فعلی در ابتدا روی maxval تنظیم شدهاند.
<dt id="cmd_vertex">vertex x y z [w]
یک رأس جدید به فهرست رأسهای فعلی اضافه میکند (به دستور mode در بالا مراجعه کنید)، و مقادیر آرگومانها را به مختصات متناظر آن، و مقادیر فهرست مقادیر مشخصههای فعلی (به دستور attribs در بالا مراجعه کنید) را به ورودیهای مربوطه در فهرست مشخصههای مرتبط با رأس اختصاص میدهد.
مقادیر x، y و z باید مقادیر صحیح در بازه بسته [-32767, 32767] باشند. مقادیر x و y به ترتیب نشاندهنده ستون و سطر تاپلی هستند که با موقعیت رأس مطابقت دارد. چنین مقادیری ممکن است متناظر با تاپلهایی خارج از محدودههای بافر فریم باشند. مبدا دستگاه مختصات در تاپل گوشه بالا و سمت چپ بافر فریم قرار دارد. محور X از چپ به راست، و محور Y از بالا به پایین امتداد دارد. مقدار منفی برای x نشاندهنده ستونی به همان تعداد تاپل در سمت چپ چپترین ستون بافر فریم است. به همین ترتیب، مقدار منفی برای y نشاندهنده سطری به همان تعداد تاپل بالاتر از بالاترین سطر بافر فریم است. توجه داشته باشید که این مختصات صرفنظر از اینکه تصویری که رسم میکنید دارای جلوه «پرسپکتیو» باشد یا خیر، مستقیماً با یک نقطه خاص در دستگاه مختصات فوق منطبق است؛ برنامه pamtris مختصات دادهشده را به هیچ وجه دچار «اعوجاج» یا تبدیل نمیکند. بنابراین اگر میخواهید تصاویری دارای پرسپکتیو رسم کنید، باید پیش از ارائه مقادیر به برنامه، خودتان با استفاده از یک روش پرتاب پرسپکتیو خارجی، مقادیر x و y را که در دستگاه مختصات pamtris پرتاب شدهاند محاسبه نمایید.
پارامتر z نشاندهنده مختصات Z رأس است، که برای محاسبه مقادیر عمق تاپلها در نواحی مثلثهای شطرنجیشده استفاده میشود. به طور شهودی، مقادیر کوچکتر برای z به معنای «نزدیکتر به بیننده»، و مقادیر بزرگتر به معنای «دورتر از بیننده» هستند (اما به خاطر داشته باشید: همانگونه که در بالا ذکر شد، مختصات x و y به هیچ وجه اعوجاج نمییابند، که بدان معناست که تحت تأثیر z یا پارامتر بعدی قرار نمیگیرند).
به صورت اختیاری، میتوانید پارامتر w را ارائه دهید که نشاندهنده یک «ضریب تصحیح پرسپکتیو» است که برای درونیابی صحیح مشخصههای رأس در سرتاسر مساحت مثلث مربوطه استفاده میشود. این مقدار باید یک عدد صحیح در بازه بسته [1, 1048575] باشد. اگر مقداری برای آن ارائه ندهید، مقدار پیشفرض ۱ استفاده خواهد شد (بنابراین، اگر میخواهید اثرات تصحیح پرسپکتیو را بر روی یک مثلث خنثی کنید تا نمونههای خروجی مانند درونیابی خطی ساده محاسبه شوند، کافی است مقداری برای w در هیچیک از رأسهای آن مثلث تعیین نکنید). اما اگر قصد دارید هندسه سهبعدی را با پرسپکتیو رسم نمایید، باید مقداری مناسب برای این پارامتر ارائه دهید، در غیر این صورت تصاویر خروجی ممکن است بسیار نادرست به نظر برسند. پارامتر w در Netpbm 10.85 (دسامبر 2018) معرفی شد.
مدل متداول
هرم دید (viewing frustum) را در نظر بگیرید که برای پرتاب رأسها از «فضای دنیای» سهبعدی به یک «فضای تصویر» صفحهای استفاده میشود. اگر این قرارداد را بپذیریم که «صفحه z» به معنای هر صفحهای موازی با صفحه دید (view-plane) است، مقدار w برای یک رأس باید (کوچکترین/اقلیدسی/عمود) فاصله بر حسب پیکسل بین نقطه مرجع پرتاب (PRP یا "چشم") و صفحه z شامل آن رأس باشد. یک راه برای محاسبه این مقدار، صرفاً محاسبه ضرب داخلی (dot product) میان بردار سهبعدی r و بردار واحد سهبعدی n است، که در آن r برداری است که از نقطه مرجع پرتاب (PRP یا "چشم") به رأس میرود، و n یک بردار نرمال صفحه دید (VPN) با طول واحد است که جهتی خلاف جهت PRP دارد. به عبارت دیگر، این مقدار برابر با طول تصویر عمودی r بر روی خط تعیینشده توسط n است.(توجه: برای هر دو بردار سهبعدی a و b با مؤلفههای اسکالر حقیقی متناظر a<sub>x</sub>، a<sub>y</sub>، a<sub>z</sub> و b<sub>x</sub>، b<sub>y</sub>، b<sub>z</sub>، ضرب داخلی میان a و b برابر است با: a<sub>x</sub>*b<sub>x</sub> + a<sub>y</sub>*b<sub>y</sub> + a<sub>z</sub>*b<sub>z</sub>.)
-
این دستور یک تصویر PAM را در خروجی استاندارد مینویسد که دادههای شطرنجی آن یک رونوشت از محتوای فعلی بافر تصویر است. مقادیر فیلدهای WIDTH و HEIGHT به ترتیب برابر با عرض و ارتفاع بافر فریم هستند که در خط فرمان هنگام فراخوانی برنامه تعیین شدهاند. فیلد MAXVAL برابر با maxval فعلی؛ فیلد DEPTH برابر با مقدار فعلی num_attribs + 1؛ و فیلد TUPLTYPE برابر با tupletype فعلی است.
این دستور هیچ اثری بر وضعیت رسم فعلی ندارد؛ مثلاً حالت رسم فعلی، فهرست رأسهای فعلی و غیره را تغییر نمیدهد.
میتوان تعداد دلخواهی از دستورات print را در موقعیتهای مختلف توالی دستورالعملهای ورودی صادر کرد تا یک جریان چندتصویری از PAM تولید شود.
- clear [ image | depth ]
-
بافر فریم را پاک میکند. بدین معنا که تمامی نمونهها در بافر تصویر مجدداً روی ۰ تنظیم شده، و تمامی ورودیها در بافر عمق مجدداً به حداکثر مقدار مجاز عمق بازمیگردند.
به صورت اختیاری، میتوان آرگومانی ارائه داد تا فقط بافر تصویر یا بافر عمق به صورت جداگانه پاک شود و دیگری دستنخورده باقی بماند. با آرگومان image، تنها بافر تصویر پاک میشود؛ با آرگومان depth، تنها بافر عمق پاک میشود. به جای نامهای کامل آرگومان، میتوان از کوتاهترین پیشوند یکتای آنها استفاده کرد که همان اثر را دارد. نویسه تکی z نیز به عنوان نام مستعار برای depth پذیرفته میشود.
همانند دستور print، این دستور نیز هیچ اثری بر وضعیت رسم فعلی ندارد.
- reset maxval num_attribs [tupletype]
-
این دستور مقادیر فعلی maxval و تعداد مشخصهها به ازای هر رأس (num_attribs) را بهروزرسانی کرده و همزمان بافر <u>تصویر</u> را با یک maxval جدید و تعداد نمونههای جدید در هر تاپل بازنشانی میکند. پارامتر maxval باید یک عدد صحیح در بازه بسته [1, 65535] و num_attribs باید یک عدد صحیح در بازه بسته [1, 20] باشد.
به صورت اختیاری، پس از آرگومان دوم، میتوان رشتهای را ارائه داد تا به tupletype فعلی اختصاص یابد. این رشته از اولین نویسه غیر فاصله خالی پس از آرگومان دوم آغاز شده و تا آخرین نویسه غیر فاصله خالی قبل از انتهای سطر (شامل آن) ادامه مییابد. اگر tupletype جدیدی ارائه نشود یا رشته ارائهشده طولانیتر از ۲۵۵ نویسه باشد، رشته خالی به tupletype فعلی اختصاص مییابد.
اثرات جانبی اجرای این دستور عبارتند از:
-
بافر تصویر جدید به محض اجرای دستور به طور کامل پاک میشود.
-
تمام مقادیر موجود در فهرست مقادیر مشخصههای فعلی روی maxval جدید تنظیم میشوند.
-
فهرست رأسهای فعلی بازنشانی میشود.
با این حال، این دستور به بافر عمق دست نمیزند: آن را به همان صورتی که قبل از اجرای دستور بود رها میکند. همچنین حالت رسم بدون تغییر باقی میماند (مثلاً اگر pamtris در حالت FAN بود، در همان حالت ادامه میدهد و غیره).
اگر این دستور با مقداری نامعتبر برای maxval یا num_attribs داده شود، نادیده گرفته میشود و بنابراین هیچیک از اثرات جانبی فوق اعمال نمیشوند و maxval، num_attribs یا tupletype فعلی نیز به هیچ وجه تغییر نمیکنند.
مجاز است مقداری برای maxval و num_attribs برابر با مقادیر فعلی آنها داده شود، اگرچه حتی در چنین حالتی نیز اثرات جانبی فوق اعمال خواهند شد.
از آنجا که این دستور با تخصیص حافظه سروکار دارد، ممکن است در اجرا با شکست مواجه شود. اگر این اتفاق بیفتد، دیگر هیچ سطری از ورودی خوانده نخواهد شد و pamtris به گونهای خاتمه مییابد که گویی دستور quit صادر شده است.
- quit
-
این دستور موجب خروج از pamtris میشود. پس از این دستور، هیچ سطر ورودی دیگری خوانده نخواهد شد.
نکات (TIPS)
بافتدهی (Texturing)
میتوان اصطلاحاً «بافتها» (textures) را بر روی تصاویر تولیدشده با pamtris اعمال کرد؛ این کار با استفاده از یک جفت مشخصه رأس به عنوان مختصات بافت، سپس استفاده از pamchannel(1) برای انتخاب کانالهای مناسب در تصویر(های) خروجی، و در نهایت پردازش نتیجه از طریق pamlookup(1) با ارائه فایل بافت مورد نظر به عنوان یک جدول جستجو (lookup table) انجامپذیر است. اگر تصاویری با پرسپکتیو رسم میکنید، حتماً مقادیر مناسبی برای پارامتر w در دستورات vertex خود ارائه دهید ( به بالا مراجعه کنید ) تا نمونههای حاصل در تصاویر تولیدی pamtris از نظر پرسپکتیو صحیح باشند. همچنین ممکن است بخواهید از pnmtile(1) برای ساخت بافتهایی استفاده کنید که قرار است در امتداد شبکههای مثلثی تکرار شوند.
تصویر متحرک GIF زیر نمونهای از دستاوردی است که میتوان با استفاده از روش فوق به دست آورد (بافت زمین برگرفته از nasa.gov ):
چرخش زمین
لبههای صافشده (Anti-aliased edges)
برنامه pamtris به خودی خود هیچگونه صافسازی لبهها (anti-aliasing) روی لبههای مثلث انجام نمیدهد. با این حال، میتوان از طریق روش «نمونهبرداری فراتر» (super-sampling) به تصاویر صافشده دست یافت: تصویر(های) خود را در اندازهای بزرگتر از اندازه نهایی مورد نظر رسم کنید، و سپس هنگامی که تمام پسپردازشها انجام شد، تصویر(های) نهایی را به اندازه دلخواه کوچک نمایید. رسم تصاویر با دو برابر عرض و ارتفاع مورد نظر، و سپس کوچک کردن آنها به اندازه مورد نظر بدون در نظر گرفتن گاما (یعنی کاری که pamscale -linear انجام میدهد) اغلب نتایج به اندازه کافی خوبی ایجاد میکند؛ اما هرچه نسبت "اندازه تصویر اصلی" / "اندازه تصویر کوچکشده" بزرگتر باشد، کیفیت اثر صافسازی لبهها بهتر خواهد بود.
همچنین ببینید (SEE ALSO)
pampick(1) pamchannel(1) pamstack(1) pamlookup(1) pamarith(1) pamscale(1) pamdepth(1) pamexec(1) pam(1)
تاریخچه (HISTORY)
برنامه pamtris در Netpbm 10.84 (سپتامبر 2018) معرفی شد.
منبع مستندات (DOCUMENT SOURCE)
این صفحه راهنما توسط ابزار Netpbm تحت عنوان 'makeman' از منبع HTML تولید شده است. مستندات اصلی در آدرس زیر قرار دارد:
| 15 April 2021 | netpbm documentation |