การสร้างรูปทรงเรขาคณิตตามขั้นตอน


10

เมื่อไม่นานมานี้ฉันได้ตรวจสอบ SceneKit สำหรับ OS X และสังเกตว่ามีวิธีการหลายอย่างจากโรงงานเพื่อสร้างรูปทรงเรขาคณิตเช่น

กล่อง, แคปซูล, กรวย, ทรงกระบอก, เครื่องบิน, ปิรามิด, ทรงกลม, พรูและหลอด

ฉันสนใจที่จะเพิ่มรูปร่างดั้งเดิมให้กับนักแสดงของฉัน แต่ฉันพยายามหาแหล่งที่เหมาะสมที่ฉันสามารถรวบรวมความเข้าใจเกี่ยวกับการสร้างขั้นตอนได้ มีทรัพยากรหลายอย่างที่อธิบายถึงทฤษฎี แต่ไม่มีซอร์สโค้ดที่เหมาะสมในการสำรองข้อมูล

SceneKit จัดเตรียมวิธีการจากโรงงานซึ่งอนุญาตให้ตั้งค่าคุณลักษณะของรูปร่างดังกล่าวแบบไดนามิก ในกรณีของกล่องคุณสามารถระบุค่าจำนวนเต็มสำหรับจำนวนความกว้างความสูงและส่วนความลึกที่แต่ละใบหน้าควรแบ่งออกเป็น

ฉันเข้าใจทฤษฎี แต่ขาดความรู้ในการเริ่มต้นการแบ่งใบหน้าเรขาคณิตเพื่อให้ได้ผลตามที่ต้องการ

จุดยอดสำหรับแต่ละรูปร่างนั้นค่อนข้างง่ายในการสร้างลูปแบบง่าย ๆ สิ่งที่ทำให้ฉันตกใจคือการรู้ว่าจะสร้างใบหน้าหรือประสานงานพื้นผิวที่เหมาะสมสำหรับแต่ละใบหน้า สามารถคำนวณ Normals ต่อหน้าดังนั้นฉันค่อนข้างมั่นใจว่าฉันสามารถบรรลุสิ่งที่ฉันต้องการได้ แต่เพิ่งรู้ว่าจะเริ่มจากตรงไหน

ใครสามารถให้รายละเอียดเกี่ยวกับเรขาคณิตเชิงกระบวนงานได้บ้าง? สิ่งที่ฉันต้องการจริงๆคือซอร์สโค้ดเพื่อรวบรวมข้อมูลบางอย่าง ฉันค้นหาบทเรียนในระดับสูงและต่ำ แต่มีไซต์หรือบล็อกที่เหมาะสมเพียงเล็กน้อยเท่านั้น หนังสือที่ดีแบบฝึกหัดบล็อกหรือรายงานการวิจัยใด ๆ ที่จะได้รับการชื่นชม

แก้ไขตามความคิดเห็น

ฉันควรชี้แจงว่าฉันรู้วิธีสร้างจุดยอดสำหรับรูปทรงพื้นฐานซึ่งส่วนใหญ่สามารถทำได้โดยใช้ลูปง่าย สิ่งที่ฉันไม่เข้าใจคือวิธีการสร้างใบหน้าจากอาร์เรย์ของจุดยอดที่สร้างขึ้น ฉันจะสร้างแถบสามเหลี่ยมหรือสามเหลี่ยมจากจุดยอดที่ดูเหมือนไม่มีการเรียงลำดับได้อย่างไร

ฉันคิดว่าเมื่อฉันผ่านจุดนี้ไปแล้วฉันสามารถสร้างบรรทัดฐานจากแต่ละหน้าได้ ในขณะที่ฉันยังไม่ได้พิจารณาเรื่องนี้ฉันได้เห็นการอ้างอิงจำนวนมากเกี่ยวกับเรื่องนี้และมั่นใจว่ามันจะง่ายพอที่จะใช้

เป็นการดีที่ฉันต้องการที่จะสามารถสร้างรูปทรงเรขาคณิตจากชุดของคุณสมบัติที่กำหนดเช่นวิธีที่ SceneKit ให้ ให้ SceneKit ทำไปแล้วและคุณสามารถทำสิ่งที่คล้ายกันใน Blender และ Maya ฯลฯ ฉันคิดว่าฉันไม่ได้พยายามที่จะใช้สิ่งที่เป็นไปไม่ได้

ส่วนสุดท้ายจะใช้พื้นผิว อีกครั้งนี่ไม่ใช่สิ่งที่ฉันได้ดำเนินการ แต่ได้อ่านและตระหนักถึงข้อกำหนด

ปัญหาหลักที่นี่คือฉันรู้ว่าสิ่งที่ฉันต้องการที่จะประสบความสำเร็จ แต่ฉันกำลังดิ้นรนที่จะถอดรหัสวิธีการใช้สำหรับการดั้งเดิมดังกล่าว ฉันหวังว่าฉันจะสามารถค้นหาความรู้บางส่วนด้วยวิธีของซอร์สโค้ด แต่ฉันยังไม่ได้เจอสิ่งที่เหมาะสมเลย


คุณบอกว่าปัญหาของคุณคือการแบ่งเรขาคณิต แต่คุณบอกว่าการทำให้จุดยอดควรเป็นเรื่องง่ายแล้วคุณบอกว่าปัญหาของคุณคือการสร้างใบหน้าและคุณบอกว่าปัญหาของคุณคือการทำแผนที่พื้นผิว คุณมีปัญหาอะไร? คุณสามารถสร้างตำแหน่งจุดสุดยอดได้หรือไม่? คุณสามารถสร้างขอบและใบหน้าได้หรือไม่? นอกจากนี้พิกัดพื้นผิวยังขึ้นอยู่กับพื้นผิวของคุณและสิ่งที่คุณต้องการให้บรรลุด้วยดังนั้นคำถามเกี่ยวกับพิกัดพื้นผิวจึงไม่ใช่สิ่งที่ดี ในที่สุดการสร้างแบบดั้งเดิมนั้นเป็นเรื่องเกี่ยวกับรูปทรงเรขาคณิตและผู้คนมักเรียกมันว่า "เรขาคณิตเชิงกระบวนงาน" แม้ว่าจะเป็นแบบนั้นก็ตาม
jrsala

ฉันเข้าใจวิธีการสร้างรูปทรงเรขาคณิตสำหรับรูปร่างที่เรียบง่ายเช่นลูกบาศก์หรือระนาบการสร้างใบหน้าที่ฉันไม่เข้าใจ ฉันจะสร้างใบหน้าจากจุดยอดได้อย่างไร การพล็อตจุดสำหรับรูปร่างที่ซับซ้อนมากขึ้นเป็นส่วนหนึ่งของปัญหาแม้ว่าฉันจะมีความเข้าใจพื้นฐาน ติดกาวพวกเขาทั้งหมดเข้าด้วยกันเป็นแถบสามเหลี่ยมหรือสามเหลี่ยมคือสิ่งที่ฉันดิ้นรนเพื่อห่อหัวของฉัน
CaptainRedmuff

ตกลงขอบคุณสำหรับรายละเอียด คุณอาจต้องการแก้ไขคำถามของคุณเพื่อชี้แจง ตอบเวลา!
jrsala

คำตอบ:


11

วิธีการสร้างขอบและใบหน้าของรูปร่างดั้งเดิมเช่นกล่องกรวยและสิ่งที่คุณอ้างถึงคือการสร้างขอบในเวลาเดียวกันกับที่คุณสร้างจุดยอด ในความเป็นจริงคุณควรสร้างจุดยอดในทางตรรกะที่ทำให้ง่ายต่อการคำนวณขอบและใบหน้าตาม

มีอัลกอริธึมที่ใช้เป็นชุดข้อมูลของจุดในอวกาศและคำนวณสิ่งที่เรียกว่า "การตั้งค่าจุดสามเหลี่ยม " เหนือมัน แต่ปัญหาของการตั้งค่าการกำหนดตำแหน่งสามเหลี่ยมคือปัญหาสมบูรณ์ - NPเพื่อให้มันเร็วขึ้นที่จะทำให้ขอบและใบหน้า ในขณะที่คุณไปกว่าจะคำนวณจุดยอดและให้อัลกอริทึมทำงาน เพียงแจ้งให้คุณทราบว่ามีวิธีแก้ปัญหานี้อยู่

นอกเหนือจากวิธีการแก้ปัญหาที่ไม่มีประสิทธิภาพนี้ฉันคิดว่าคุณสามารถปฏิบัติดั้งเดิมได้ในแต่ละกรณีเช่นในตัวอย่างที่ตามมา

ตาข่ายเป็นจุดและใบหน้า ขอบจะมีอยู่ในคำอธิบายของใบหน้ายกเว้นว่าตาข่ายของคุณมีเส้นที่ไม่ได้ทำการแต่งหน้า จุดยอดคือ tuples ของ 3 จุดลอยตัวพิกัด ขอบเป็นคู่ของการอ้างอิงถึงจุดยอด แต่จากนั้นอีกครั้งคุณแน่นอนไม่ต้องการพวกเขา พูดเช่นว่าจุดยอดของคุณอยู่ในอาร์เรย์ที่จัดทำดัชนี ขอบของคุณก็อาจเป็นดัชนีคู่ของอาร์เรย์นั้น ใบหน้ามีแฝดสามของการอ้างอิงไปยังจุดหรือแฝดสามของดัชนีในกรณีอาร์เรย์จัดทำดัชนี

คุณควรนับจำนวนจุดยอดขอบและใบหน้าที่ประกอบขึ้นเป็นรูปทรงดั้งเดิมแต่ละอันเพราะการนับพวกมันหมายถึงการเข้าใจคุณสมบัติของวัตถุซึ่งช่วยให้คุณกำหนดวิธีการที่คุณสร้างขึ้นโดยใช้ลูปและ เครื่องมืออื่น ๆ ที่เราจะเห็น

รูปกรวย

สำหรับกรวยที่มีจุดยอดn + 2ขอบ3nและใบหน้า2n :

  1. ทำสองจุดยอดต่าง ๆ
  2. สร้างวงกลมรอบจุดยอดหนึ่งจุด (จุดยอดฐาน) ซึ่งอยู่ภายในระนาบตั้งฉากกับส่วนระหว่างจุดยอดสองจุดแรก หวังว่าคุณสามารถสร้างวงกลมโดยใช้ตรีโกณมิติได้ไหม? นั่นคือจุดยอดทั้งหมดของกรวย นั่นก็เป็นหนึ่งในสามของขอบทั้งหมด (มีขอบnในวงกลมและรวมทั้งหมด3n )
  3. ทำให้nขอบฐานจากจุดสุดยอดไปยังnจุดในวงกลม คุณสามารถทำครึ่งหนึ่งของใบหน้า (นั่นคือnใบหน้า) ในขณะที่คุณทำเช่นนั้น
  4. ยี่ห้อnขอบจากจุดสุดยอดเคล็ดลับให้กับnจุดในวงกลม คุณสามารถสร้างใบหน้าอีกครึ่งหนึ่ง (นั่นคือnใบหน้า) เช่นเดียวกับที่คุณทำ

1) สองจุดยอด 2) และวงกลม
3) และใบหน้า
4) และใบหน้า
ผลลัพธ์สุดท้าย:ผลลัพธ์

คุณยังสามารถสร้างขอบและใบหน้าในขณะที่คุณเรียกใช้การวนซ้ำที่ทำให้วงกลม ความซับซ้อนเดียวกันสิ่งเดียวกัน สร้างจุดสุดยอดหนึ่งจุดบนวงกลมเก็บไว้ในอาร์เรย์ของจุดยอดของคุณเพิ่มขอบที่สอดคล้องกัน (คู่ของดัชนี) เข้ากับอาร์เรย์ของดัชนีถ้าคุณรู้สึกว่ามันและในที่สุดก็เพิ่มใบหน้าที่สอดคล้องกับอาร์เรย์ของดัชนีสามส่วนของคุณ . ไปยังจุดสุดยอดถัดไป

ทรงกระบอกและท่อ: ไม่ทำงานสองครั้งเหมือนกันและล่าม

อีกครั้งสำหรับหลอดมันเริ่มต้นด้วยจุดสุดยอดและวงกลมซึ่งจะเป็นศูนย์กลางของทั้งด้านบนหรือด้านล่างของกระบอกสูบ:

  1. ทำจุดสุดยอด
  2. ทำวงกลมรอบจุดสุดยอด เพิ่มขอบ (ถ้าคุณต้องการขอบ) ระหว่างจุดยอดที่ต่อเนื่องของวงกลมและระหว่างจุดยอดกึ่งกลางและจุดสุดยอดของวงกลมแต่ละจุด เพิ่มใบหน้าระหว่าง triplet ของแต่ละจุดยอดที่ทำจากจุดยอดกึ่งกลางและจุดยอดสองจุดต่อเนื่องบนวงกลม
  3. ทำสำเนาทั้งหมดนั้นแปลสำเนาในทิศทางตั้งฉากกับฐานที่คุณเพิ่งทำโดยความยาวของทรงกระบอกที่ต้องการ
  4. เชื่อมโยงด้านบนและด้านล่าง

ในการเชื่อมโยงด้านบนและด้านล่างคุณต้องทำการล่ามระหว่างคู่ของจุดยอดที่เผชิญหน้ากัน คิดล่วงหน้าแล้วทำไมไม่ทำตัวเองให้เป็นฟังก์ชั่นที่ทำให้ใบหน้ารูปสามเหลี่ยมสองอันออกมาจากจุดยอดทั้งสี่?

เสร็จสิ้น โปรดสังเกตว่าเวลานี้เราใช้ความจริงที่ว่าโครงสร้างเดียวกัน (วงกลม + กลาง) ปรากฏขึ้นสองครั้งในทรงกระบอกเพื่อใช้ทางลัด เราไม่ได้มีเพื่อให้ทุกจุดขอบและใบหน้าด้วยมือขัดกับกรวยที่มันเป็นสิ่งจำเป็น

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

คุณต้องใช้คุณสมบัติทางเรขาคณิตของวัตถุที่คุณสร้างเพื่อทำให้การสร้างนั้นง่ายขึ้น กล่าวคือพวกเขาสมมาตรและค่าคงที่

สำหรับทรงกระบอกอย่าทำจุดสุดยอดพื้นฐานแค่ทำให้วงกลมทำซ้ำแปลแปลทำล่ามทำเสร็จแล้ว

ทรงกลมและแคปซูล: เพิ่มความซับซ้อน แต่ก็ไม่ได้ผลเหมือนกันสองเท่า

ในการสร้างแคปซูลเราต้องการสร้างทรงกลม UV แบ่งออกเป็นสองส่วนแปลครึ่งแรกจากนั้นเชื่อมทั้งสองกับด้านข้างของแคปซูล

อีกครั้งเป็นไปได้ที่จะสร้างทรงกลมเพียงหนึ่งในแปด (!!) จากนั้นทำซ้ำและย้อนกลับจากนั้นทำซ้ำและย้อนกลับผลลัพธ์ยกเว้นตามแกนอื่น ฯลฯ เพื่อรับทรงกลมเต็มใน 4 ขั้นตอน (สร้างที่แปด ทำซ้ำและย้อนกลับสามครั้ง) อาจ overkill แต่น้อยกว่าในกรณีของวงกลม

ทรงกลม UV ที่เรียบง่าย:
รูปทรงกลม

ในความเป็นจริงเราทำเพียงครึ่งเดียวเท่านั้น (ตัวอย่าง) ทำซ้ำครึ่งหนึ่งหันสำเนากลับด้านและแปลตามความยาวของแคปซูล:
แบ่งเท่า ๆ กัน

เราเชื่อมโยงครึ่งบนและล่าง:
แคปซูล

การทำงานอย่างหนักจริง ๆ บ้างมาจากตรีโกณมิติที่ทำให้เกิดเป็นทรงกลม ชุดของจุดยอดทั้งหมดที่อยู่ในทรงกลม UV สามารถอธิบายได้ว่าเป็นชุดของจุดทั้งหมดของรูปแบบ:

จุด

โดยที่Rคือรัศมีของทรงกลมและสำหรับจำนวนเต็มบวกแม้แต่Nบางตัวเรามีค่าคงที่

θ = ×π / N ,

kและnเป็นจำนวนเต็มกับkที่แตกต่างจาก0ไป2N-1และnที่แตกต่างจาก-N / 2เพื่อ+ N / 2

ที่จะทำให้ครึ่งทรงกลมหรือทรงกลมที่แปดของคุณมีการ จำกัด การชุดของค่าที่ถ่ายโดยkและn

ถ้าkเป็นตัวเลขจริงและไม่ใช่แค่จำนวนเต็มคุณจะได้ทรงกลมทั้งหมดไม่ใช่แค่จุดยอดบนพื้นผิว ดังนั้นสิ่งที่เราได้ทำที่นี่จะrasterizing สมการพื้นผิวของดั้งเดิม

พรูที่น่ากลัว : มันง่ายมากหลังจากที่พวกเราได้เห็นกันแล้ว!

อีกครั้งตรีโกณมิติมากขึ้นจุดยอดมากล่ามมากขึ้นสมมาตรมากขึ้นค่าคงที่มากขึ้น ... เรขาคณิตมากขึ้น! ค้นหาสมการสำหรับพื้นผิวของพรู "rasterize มัน" อย่างถูกต้องลดความซับซ้อนของปัญหาโดยใช้ symmetries (ชัดเจน) ของพรูและในที่สุดวนรอบชุดของจุดยอดที่คุณเพิ่งกำหนดและทำขอบและใบหน้าตามที่คุณ ไป!

ดู? ตรงไปตรงมาโดยสิ้นเชิง


ว้าว. ขอขอบคุณสำหรับคำตอบอย่างละเอียดและเป็นตัวอย่างมากมาย ฉันไม่ได้พิจารณาความคิดในการสร้างทรงกลมเพียงครึ่งเดียวและสะท้อนองค์ประกอบที่สมมาตร ขอบคุณมากที่สละเวลาเขียนสิ่งนี้ในลักษณะที่ฉันสามารถเข้าใจและหวังว่าจะนำไปปฏิบัติได้อย่างง่ายดาย
CaptainRedmuff

ยินดีต้อนรับคุณ! ฉันขอโทษที่ไม่มีรหัส
jrsala

โครงร่างของวิธีการเป็นสิ่งที่ฉันต้องการจริงๆ ฉันสามารถเริ่มต้นแผนปฏิบัติการจากที่นั่นอย่างน้อย:] ฉันไม่คิดว่าคุณมีข้อมูลใด ๆ เกี่ยวกับกล่อง / ก้อนที่มีขอบลบมุม? docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/…
CaptainRedmuff

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.