418341: สภาพแวดล้อมการทำงานคอมพิวเตอร์กราฟิกส์ การบรรยายครั้งที่ 7

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
อสมการเชิงเส้นตัวแปรเดียว
Advertisements

PHPPHP การเขียนโปรแกรมคอมพิวเตอร์ 1 สาขาวิชาระบบสารสนเทศ คณะเทคโนโลยีการจัดการ.
บทที่ 6 บทที่ 6 คำสั่งแก้ไขปัญหาแบบ เลือก (CONDITION)
เป็นหลักสำคัญในการนำเสนอเนื้อหา ของบทเรียนคอมพิวเตอร์ช่วยสอนก็คือ ควร นำเสนอภาพที่เกี่ยวข้องกับเนื้อหา ประกอบ กับคำอธิบายสั้นๆ ง่ายๆ แต่ได้ใจความ การใช้ภาพประกอบจะทำให้ผู้เรียน.
แบบสอบถาม (Questionnaire)
การใช้งานโปรแกรม SPSS
หน่วยที่ 3 ภาษาคำสั่งพื้นฐานที่ใช้เขียนโปรแกรม PLC
ซอฟต์แวร์ระบบที่รู้จักกันดี คือซอฟต์แวร์ควบคุมการปฏิบัติการ ของคอมพิวเตอร์ที่เรียกว่า ระบบปฏิบัติการ ระบบปฏิบัติการเป็นชุดคำสั่งที่ใช้ควบคุมระบบฮาร์ดแวร์และ.
กาญจนา ทองบุญนาค สาขาวิชาคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี
หน่วยที่ 5 การเวียนเกิด
CD แผ่น ชื่อ File Program
ครั้งที่ 7 รีจิสเตอร์ (REGISTER). รีจิสเตอร์ (Register) รีจิสเตอร์เป็นวงจรความจำที่ใช้ในการเก็บค่า ทางไบนารี่ ใช้ในการเก็บค่าในระหว่างการ ประมวลผลโดยใช้ฟลิป.
LOGO ภาษาซี 1.1 อ. กฤติเดช จินดาภัทร์. LOGO ตัวอย่างโค้ดภาษาซี
๕ เรื่องเด่นในร่างรัฐธรรมนูญ
ALLPPT.com _ Free PowerPoint Templates, Diagrams and Charts.
บทที่ 3 องค์ประกอบของการสัมมนา
หน่วยที่ 1 ปริมาณทางฟิสิกส์ และเวกเตอร์
การตรวจสอบคุณภาพเครื่องมือ
4) จำนวนคู่สองจำนวนที่เรียงติดกัน เมื่อนำ 6 มาลบออกจากจำนวนที่มากกว่าแล้ว คูณด้วย 3 จะได้ผลลัพธ์เท่ากับเมื่อนำ 4 มาบวกกับจำนวนที่น้อยกว่าแล้วคูณด้วย 7.
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
แรงแบ่งได้เป็น 2 ลักษณะ คือ 1. แรงสัมผัส ( contact force )
หลักการลดรูปฟังก์ชันตรรกให้ง่าย
Number system (Review)
องค์ประกอบและเทคนิคการทำงาน
อาจารย์อภิพงศ์ ปิงยศ บทที่ 2 : แบบจำลองเครือข่าย (Network Models) part1 สธ313 การสื่อสารข้อมูลและเครือข่ายคอมพิวเตอร์ทางธุรกิจ อาจารย์อภิพงศ์
บรรยายครั้งที่ 5 - กราฟฟิกวิศวกรรม 1
การประยุกต์ Logic Gates ภาค 2
สมการเชิงเส้น (Linear equation)
รายการ(List) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
บทที่ 7 การหาปริพันธ์ (Integration)
STACK สแตก(stack) เป็นโครงสร้างข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านเดียว ดังนั้น ข้อมูลที่เข้าไปอยู่ใน stack ก่อนจะออกจาก stack.
ระดับความเสี่ยง (QQR)
Multistage Cluster Sampling
โครงสร้างภาษา C Arduino
บทที่ 1 ความรู้ทั่วไปเกี่ยวกับคอมพิวเตอร์
SPEI R & R Studio Program User Manual.
บทที่ 4 การอินทิเกรต (Integration)
Basic Input Output System
ชุดที่ 1 ไป เมนูรอง.
ยินดีต้อนรับสู่ PowerPoint
“พื้นที่ที่สำรองไว้สำหรับคำอ้างอิงที่จะให้เคลื่อนไหวที่นี่ ”
พื้นฐานการออกแบบ กราฟิก หมายถึง ศิลปะแขนงหนึ่งซึ่งใช้การสื่อความหมาย ด้วยเส้น สัญลักษณ์ รูปวาด ภาพถ่าย กราฟ แผนภูมิ การ์ตูน ฯลฯ เพื่อให้สามารถสื่อความหมายของข้อมูลได้ถูกต้องตรง.
วิธีการกำหนดค่า Microsoft SharePoint ของคุณ เว็บไซต์ออนไลน์
Data storage II Introduction to Computer Science ( )
ตอนที่ 1: ใจที่ตั้งมั่นคง
บทที่8 ภาคตัดกรวย 2. ภาคตัดกรวย 2. วงกลม กรวยเป็นรูปทรงเรขาคณิต
2. ประโยคเงื่อนไข ข้อความที่ประกอบด้วย 2 ข้อความที่เชื่อมต่อกันด้วย ถ้า... แล้ว... เรียกข้อความในลักษณะเช่นนี้ว่า ประโยคเงื่อนไข - เรียกข้อความที่ตามหลัง.
โครงสร้างข้อมูลแบบสแตก (stack)
สมการพหุนาม ที่มีความซับซ้อนมากขึ้น
วัฏจักรหิน วัฏจักรหิน : วัดวาอาราม หินงามบ้านเรา
การสร้างแบบสอบถาม และ การกำหนดเงื่อนไข.
Data storage II Introduction to Computer Science ( )
บรรยายครั้งที่ 8 - กราฟฟิกวิศวกรรม 1
หน่วยที่ 6 อะเรย์ของอักขระ
บทที่ 3 โรงเรือนและอุปกรณ์โคเนื้อ
บทที่ 8 การแก้ไขข้อผิดพลาดโปรแกรม(Debugging)
Tree.
ค่ารูรับแสง - F/Stop ค่ารูรับแสงที่มีค่าตัวเลขต่ำใกล้เคียง 1 มากเท่าไหร่ ค่าของรูรับแสงนั้นก็ยิ่งมีความกว้างมาก เพราะเราเปรียบเทียบค่าความสว่างที่ 1:1.
2 โครงสร้างข้อมูลแบบสแตก (STACK).
เริ่มต้นสร้างบล็อกเวิร์ดเพรส
การเขียนโปรแกรมคอมพิวเตอร์ แบบภาษาเชิงวัตถุ
ฟังก์ชันของโปรแกรม Computer Game Programming
การเติบโตของฟังก์ชัน (Growth of Functions)
การเขียนโปรแกรมด้วยภาษาไพทอน การเขียนโปรแกรมแบบทางเลือก
บทที่ 5 พัลส์เทคนิค
ทายสิอะไรเอ่ย ? กลม เขียวเปรี้ยว เฉลย ทายสิอะไรเอ่ย ? ขาว มันจืด เฉลย.
การเคลื่อนที่แบบฮาร์มอนิกอย่างง่าย (Simple harmornic motion)
การวิเคราะห์สถานะคงตัวของ วงจรที่ใช้คลื่นรูปไซน์
Class Diagram.
พื้นฐานการมองแบบภาพ 2D 3D
ใบสำเนางานนำเสนอ:

418341: สภาพแวดล้อมการทำงานคอมพิวเตอร์กราฟิกส์ การบรรยายครั้งที่ 7 pramook@gmail.com TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AAAAAAA

การแปลงกับการวาดภาพ การแปลงสามารถนำมาใช้สร้างภาพที่มีความซับซ้อนได้มากมาย เราจะมาดูตัวอย่างการสร้าง แฟรกตัล (fractal) รูปที่พอเอาแว่นขยายส่องดูแล้วเห็นเป็นลักษณะเหมือนกับตอนไม่ได้ใช้แว่นขยายดู

Sierpinski Triangle

Sierpinski Triangle เพื่อความง่ายในการสร้าง เราจะแบ่ง Sierpinski triangle ออกเป็นชั้นๆ ชั้นที่ 0 เป็นสามเหลี่ยมด้านเท่าธรรมดา

Sierpinski Triangle ชั้นที่ 1 เกิดจากการเอา Sierpiński triangle ชั้นที่ 0 ที่ย่อส่วนลงสองเท่ามาเรียงกันตามรูปข้างล่างนี้

Sierpinski Triangle Sierpiński Triangle ชั้นที่ 2 เกิดจากการเอา Sierpiński triangle ชั้นที่ 1 ที่ย่อส่วนลงสองเท่ามาเรียงกันตามรูปข้างล่างนี้

Sierpinski Triangle Sierpiński Triangle ชั้นที่ 3 เกิดจากการเอา Sierpiński triangle ชั้นที่ 2 ที่ย่อส่วนลงสองเท่ามาเรียงกันตามรูปข้างล่างนี้

Sierpinski Triangle Sierpiński Triangle ชั้นที่ k เกิดจากการเอา Sierpiński triangle ชั้นที่ k-1 ที่ย่อส่วนลงสองเท่ามาเรียงกันตามรูปเดิม ข้างล่างนี้คือ Sierpiński triangle ประมาณชั้นที่ 8

เราจะวาด Sierpinski Triangle ได้อย่างไร? เขียนฟังก์ชัน void draw_sierpinski(int k) ที่ทำการวาด Sierpinski Triangle ชั้นที่ k มีกฎอยู่สองข้อในการวาด Sierpinski Triangle ถ้า k = 0 ให้วาดสามเหลี่ยมด้านเท่า ถ้า k > 0 ให้วาด Sierpinski Triangle ชั้นที่ k-1 สามอันเรียงกันตามรูปที่เราเคยเห็นมา

วาดสามเหลี่ยมด้านเท่า ต้องการวาดสามเหลี่ยมด้านเท่าความยาวด้านละ 1 หน่วย จุดศูนย์กลาง (จุด centroid) อยู่ที่จุด (0,0)

วาดสามเหลี่ยมด้านเท่า void draw_triangle() { glBegin(GL_LINE_LOOP); glVertex2d( 0.0, 1.0/sqrt(3.0)); glVertex2d( 0.5, -0.5/sqrt(3.0)); glVertex2d(-0.5, -0.5/sqrt(3.0)); glEnd(); }

ผลลัพธ์

ฟังก์ชัน draw_sierpinski void draw_sierpinski(int k) { if (k == 0) draw_triangle(); else // วาด Sierpinski triangle // ชั้นที่ k-1 สามอัน }

วาด Sierpinski Triangle ชั้นที่ k-1 สามอัน วาดอย่างไร? เรียก draw_sierpinski(k-1) วาดตรงไหน?

วาด Sierpinski Triangle ชั้นที่ k-1 สามอัน Translate centroid ไปเป็นจุด Scale ขนาดลดลง 2 เท่า (= ขยาย 0.5 เท่า) วาด Sierpinski Triangle อันล่างขวา วาด Sierpinski Triangle อันล่างซ้าย

วาด Sierpinski Triangle ชั้นที่ k-1 สามอัน void draw_sierpinski(int k) { if (k == 0) draw_triangle(); else glLoadIdentity(); glTranslated(0.0, 0.5 / sqrt(3.0), 0.0); glScaled(0.5, 0.5, 0.5); draw_sierpinski(k-1); glTranslated(0.25, -0.25 / sqrt(3.0), 0.0); glTranslated(-0.25, -0.25 / sqrt(3.0), 0.0); }

วาด Sierpinski Triangle ชั้นที่ k-1 สามอัน draw_siepinski(0)

วาด Sierpinski Triangle ชั้นที่ k-1 สามอัน draw_siepinski(1)

วาด Sierpinski Triangle ชั้นที่ k-1 สามอัน draw_siepinski(2)

วาด Sierpinski Triangle ชั้นที่ k-1 สามอัน draw_siepinski(2) ???

เกิดอะไรขึ้น? ระบบพิกัดสำหรับวาด Siepinski triangle ระดับ k = I

เกิดอะไรขึ้น? ระบบพิกัดสำหรับวาด Siepinski triangle บน คือ TUS0.5 =MU คือ TRS0.5 =MR ระบบพิกัดสำหรับวาด Siepinski triangle ซ้าย คือ TLS0.5 =ML

เกิดอะไรขึ้น? MUMU MUML MUMR MLMU MRMU MLML MLMR MRML MRMR

พิจารณา code ใหม่อีกครั้ง MODELVIEW = M glLoadIdentity(); MODELVIEW = I glTranslated(...); MODELVIEW = T glScaled(...); MODELVIEW = TS draw_sierpinski(k-1); MODELVIEW = ???

พิจารณา code ใหม่อีกครั้ง MODELVIEW = M glLoadIdentity(); MODELVIEW = I glTranslated(...); MODELVIEW = T glScaled(...); MODELVIEW = TS draw_sierpinski(k-1); MODELVIEW = ??? ความจริงแล้ว MODELVIEW ควรมีค่าเท่ากับ MTS!!!

พิจารณา code ใหม่อีกครั้ง MODELVIEW = M glLoadIdentity(); MODELVIEW = I glTranslated(...); MODELVIEW = T glScaled(...); MODELVIEW = TS draw_sierpinski(k-1); MODELVIEW = ??? MODELVIEW = ??? ตรงจุดสองจุดนี้ MODELVIEW ควรมีค่าเท่ากับ M

แล้วจะต้องทำอะไร? ก่อนสั่ง glTranslated(…) ต้องมีการจำค่าเมตริกซ์ MODELVIEW อันเดิมเอาไว้ หลังเรียก draw_sierpinski(…) ต้องมีการเอาค่า MODELVIEW อันเดิมคืนกลับมา

glPushMatrix() และ glPopMatrix() ทำการ push ค่าของเมตริกซ์ใน mode ปัจจุบันลง stack glPopMatrix() pop stack ที่เก็บค่าเมตริกซ์เอาไว้แล้วนำค่าที่ได้ไปให้ เราสามารถใช้ฟังก์ชันสองฟังก์ชันนี้ในการ “จำ” transform ได้

เขียนใหม่ MODELVIEW = M glPushMatrix(); MODELVIEW = M (จำ) glTranslated(...); MODELVIEW = MT glScaled(...); MODELVIEW = MTS draw_sierpinski(k-1); MODELVIEW = ??? glPopMatrix(); MODELVIEW = M

ทั้งฟังก์ชัน void draw_sierpinski(int k) { if (k == 0) draw_triangle(); else glPushMatrix(); glTranslated(0.0, 0.5 / sqrt(3.0), 0.0); glScaled(0.5, 0.5, 0.5); draw_sierpinski(k-1); glPopMatrix(); glTranslated(0.25, -0.25 / sqrt(3.0), 0.0); glTranslated(-0.25, -0.25 / sqrt(3.0), 0.0); }

ผลลัพธ์ draw_sierpinski(2)

ผลลัพธ์ draw_sierpinski(3)

ผลลัพธ์ draw_sierpinski(4)

ผลลัพธ์ draw_sierpinski(8)

Hierarchical scene organization

การจัดฉาก ฉากประกอบด้วยวัตถุหลายๆ อย่าง ศิลปินสร้างวัตถุแต่ละชิ้นขึ้นมาใน object space ของมันเอง วัตถุแต่ละวัตถุจะต้องถูกแปลงจากที่อยู่ใน object space ให้มาอยู่ใน world space

ตัวอย่างฉาก ภาพจาก Durand and Cutler, 6.837 Fall 2003 Lecture Note: Transformations 2: In Modeling

ฉากตัวอย่าง y=1.2 y=0 (0,0) y=-1 x=-2 x=0 x=2

วัตถุ สมมติว่าศิลปินสร้างวัตถุให้เรามาสองอย่าง Circle: วงกลมรัศมีหนึ่งหน่วยที่มีจุดศูนย์กลางอยู่ที่จุด (0,0) Square: สี่เหลี่ยมจัตุรัสที่มีจุดมุมล่างซ้ายอยู่ที่จุด (-1,-1) และมุมบนขวาอยู่ที่ (1,1) เราจะสร้างฉากที่เห็นในสไลด์ที่แล้วอย่างไร?

การจัดฉากแบบเป็นลำดับขึ้น เวลาจัดฉากเรามักจะแบ่งมันเป็นลำดับขั้น ฉาก เก้าอี้ โต๊ะและถาดผลไม้ พื้น Square Square Square โต๊ะ ถาดผลไม้ Square Square Square Square Square Circle Circle

วาดเก้าอี้ เราเลือก object space ของเก้าอี้ให้มุมล่างซ้ายของมันอยู่ที่จุด (0,0) y=2 y=1 y=0 (0,0)

วาดเก้าอี้ ขาหน้า พื้น ขาหลังและพนัก ย้ายจุดศูนย์กลางไปอยู่ที่ (0.1, 0.35) ขยายตามแกน x = 0.1 เท่า ตามแกน y = 0.35 เท่า วาด Square พื้น ย้ายจุดศูนย์กลางไปอยู่ที่ (0.3, 0.8) ขยายตามแกน x = 0.3 เท่า ตามแกน y = 0.1 เท่า ขาหลังและพนัก ย้ายจุดศูนย์กลางไปอยู่ที่ (0.7, 1.1) ขยายตามแกน x = 0.1 เท่า ตามแกน y = 1.1 เท่า

Scene Graph เราสามารถแทนการแปลงและการวาดภาพในสไลด์ที่แล้วได้ด้วยแผนภาพที่เรียกว่า scene graph เก้าอี้ Square Square Square

โค้ด เราสามารถเปลี่ยน scene graph เป็นโค้ดได้อย่างง่ายดาย void draw_chair() { glPushMatrix(); glTranslated(0.1, 0.35, 0.0); glScaled(0.1, 0.35, 1.0); draw_square(...); glPopMatrix(); glTranslated(0.3, 0.8, 0.0); glScaled(0.3, 0.1, 1.0); glTranslated(0.7, 1.1, 0.0); glScaled(0.1, 1.1, 1.0); }

วาดส่วนประกอบอื่นๆ ของฉาก สมมติว่าเราสร้างฟังก์ชัน draw_table() เพื่อวาดโต๊ะ โดยที่มุมล่างซ้ายของมันอยู่ที่จุด (0,0) draw_tray() เพื่อวาดถาดผลไม้ โดยที่มุมล่างซ้ายของมันอยู่จุด (0,0) draw_floor() เพื่อวาดพื้น ฟังก์ชันพวกนี้สามารถสร้างได้เหมือน draw_chair() โค้ดจริงๆ ไปดูได้ในโค้ดตัวอย่าง

วาดส่วนประกอบอื่นๆ ของฉาก เราสามารถวาดโต๊ะและถาดผลไม้ได้ดังต่อไปนี้ วาดโต๊ะโดยการเรียก draw_table() วาดถาดผลไม้ ย้ายจุดมุมซ้ายไปอยู่ที่จุด (0.8, 1.3) แล้วเรียก draw_tray()

Scene Graph ของโต๊ะและถาด

โค้ด void draw_table_and_tray() { draw_table(); glPushMatrix(); glTranslated(0.8, 1.3, 0.0); draw_tray(); glPopMatrix(); }

Scene Graph ของฉาก ฉาก พื้น โต๊ะและถาด เก้าอี้ โต๊ะ ถาด Square Square

โค้ด void draw_scene() { glPushMatrix(); glTranslated(-1.7, -1.0, 0.0); draw_table_and_tray(); glPopMatrix(); draw_floor(); glTranslated(0.9, -1.0, 0.0); draw_chair(); }

ผลลัพธ์

บทเรียน เราสามารถสร้างฉากที่มีความซับซ้อนได้จาก วัตถุง่ายๆ การแปลง เพื่อความสะดวกและความเข้าใจง่าย เราสามารถจับกลุ่มวัตถุเป็นกลุ่มๆ แล้วสร้างฉากจากกลุ่มของวัตถุได้ เราสามารถแทนการจัดฉากได้ด้วยแผนภาพที่เรียกว่า scene graph ซึ่งประกอบด้วย กล่องสำหรับแทนวัตถุ กล่องสำหรับแทนกลุ่มของวัตถุ กล่องสำหรับแทนการแปลง

บทเรียน เมื่อเขียน scene graph แล้วเราสามารถเขียนโค้ดเพื่อวาดฉากที่ scene graph บรรยายได้อย่างง่ายดาย กล่องวัตถุหรือกลุ่มของวัตถุ -> ฟังก์ชัน กล่องการแปลง -> การเรียกฟังก์ชันทำการแปลง เช่น glTranslate, glScale หรือ glRotate แขนงของกล่อง -> การเรียก glPushMatrix() แล้วลงไปจัดการแขนงนั้น แล้วจึงเรียก glPopMatrix()