วิธีการใช้การแปล, ระดับ, gizmos หมุนสำหรับจัดการการแปลงของวัตถุ 3 มิติ?


11

ฉันอยู่ในขั้นตอนการพัฒนาโปรแกรมแก้ไข 3D พื้นฐาน มันใช้ OpenGL สำหรับการเรนเดอร์โลก 3 มิติ ตอนนี้ฉากของฉันเป็นเพียงกล่องขนาดต่าง ๆ และฉันอยู่บนเวทีที่ฉันต้องการให้สามารถเลือกกล่องแต่ละกล่องแล้วย้าย / ปรับขนาด / หมุนเพื่อให้ได้การแปลงที่ฉันต้องการ

ฉันจะแก้ปัญหาในการนำเครื่องมือ gizmos ของเครื่องมือเหล่านี้ (หรือที่จับหรือวิธีที่คนทั่วไปเรียกพวกเขา) และเลือกพวกเขาในแต่ละแกนเพื่อทำการเปลี่ยนแปลงในการแปลงด้วยเมาส์ของฉัน? เพื่อความชัดเจน: ป้อนคำอธิบายรูปภาพที่นี่

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


1
โดยปกติแล้วคุณจะต้องเดินทางไปทั่วโลกด้วยตำแหน่งของเมาส์และดูว่าคุณโดน Gizmo หรือไม่ คุณยังสามารถเปลี่ยน gizmo ให้เป็นพื้นที่หน้าจอเพื่อตรวจจับการชนกันของข้อมูลได้ โดยปกติแม้ว่าคุณจะทำระยะห่างจากประเภทเรย์ไปยังส่วนของเส้น การหมุนมักทำในลักษณะแทร็กบอลเสมือนจริง ดู Melax ใน Game Programming Gems 1. การแปลเป็นผลิตภัณฑ์ดอทค่อนข้างดี
RandyGaul

คำตอบ:


9

ในบางช่วงเวลาของฉันที่ e-on ฉันได้รักษา gizmos ของสายผลิตภัณฑ์Vue
ฉันสามารถบอกคุณได้ว่าจะใช้เวลาหลายวันเต็มเวลา
ถ้าคุณไม่พบไลบรารี่หรือซุปเปอร์ฉลาดวิธีคลาสสิกคือการประสานงานของเมาส์ในหน้าต่างเมื่อคุณคลิกถ้ามันเป็นพิกัดสัมพัทธ์กับวิวพอร์ตคุณสามารถหาร x และ y ตามความกว้างและความสูงได้ รับเวกเตอร์ (ลอย 2d) ในช่วง [0,1] ลบ (0.5,0.5) เพื่อให้เข้าสู่ช่วง [-0.5, 0.5] สำหรับทั้ง x และ y
จากนั้นคุณสร้างรังสีจากพิกัดนี้โดยใช้ x และ y เพียงแค่เป็นรังสี x และ y และคุณตั้งค่า z เป็นระยะโฟกัส บางครั้งอัตราส่วนภาพเป็นความเจ็บปวดในตูดในการดำเนินการนี้ ข้อผิดพลาดเล็กน้อยที่เล่นซอและการทดลองจะทำให้คุณได้รับการแก้ไข
จากนั้นคุณต้องตรวจสอบจุดตัดด้วยองค์ประกอบ gizmos ของคุณไม่ว่าคุณจะมีตาข่ายที่คุณสร้างขึ้นหรือสร้างแบบจำลองในเครื่องปั่นหรือ DCC อื่น ๆ หรือส่วนตาข่ายที่สามารถประกบกัน ... เพียงแค่ใช้ส่วนตาข่ายเหล่านั้นเป็นเรย์ / ข้อความค้นหาการแยกสามเหลี่ยม
หรือถ้าคุณมีมันเรย์ / สูบเรย์ / ทรงกลมตามลักษณะ Gizmo ของคุณและชิ้นส่วน คุณจำเป็นต้องมีขั้นตอนการแยกที่มีความสามารถที่จะใช้เมทริกซ์การเปลี่ยนแปลงในแบบดั้งเดิมที่พวกเขาชนกัน
สำคัญอย่างยิ่งเนื่องจาก gizmo ของคุณจะแปลด้วยวัตถุที่มันทำหน้าที่เคลื่อนที่มันจะหมุนและมันจะปรับขนาดด้วยระยะผกผันของกล้องเพื่อให้มันคงขนาดที่ฉายไว้บนหน้าจอ
จากนั้นคุณมีส่วนที่โต้ตอบได้ง่ายที่สุดคือเอาเดลต้าของจุดเมื่อเมาส์เป็นเหตุการณ์ "เมาส์ลง" ครั้งแรกและตำแหน่ง "เมาส์เลื่อน" ปัจจุบันใน 2D บริสุทธิ์และใช้เดลต้านี้เป็นการเคลื่อนไหวของแกนปัจจุบัน ในอวกาศโลกคูณด้วยบางอย่างkที่คุณตัดสินใจสังเกตุ ตามหน่วยภายในของคุณเทียบกับพิกเซลเทียบกับระดับการซูมปัจจุบัน ฯลฯ
ขั้นตอนสุดท้ายคือเพียงนำเมทริกซ์ของ gizmo ไปใช้กับวัตถุที่มีการจัดการเพื่อให้เป็นไปตามนั้น

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

ฉันขอแนะนำให้คุณดาวน์โหลด Embree 2.0 จาก intel เพื่อทำแบบสอบถามการแยกเรย์ / สามเหลี่ยมสำหรับคุณดังนั้นคุณไม่ต้องกังวลกับการเขียนโค้ดนั้น หรือคุณสามารถคัดลอก / วางและปรับรหัสจากเครื่องปั่น ... อย่างไร้ความปราณีฉันคิดว่าพวกเขาย้ายไปที่ใบอนุญาต Apache? ควรเป็นไปได้อย่างถูกกฎหมาย


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

0

สำหรับหุ่นยนต์ - นักแปลฉันใช้อัลกอริธึมตาม:

1) เมื่อเลื่อนเมาส์ลงเราต้องตรวจสอบว่าลูกศรตัดกันหรือไม่ ตัวอย่างเช่นเราพิจารณาลูกศร X เราสร้างเรย์ในอวกาศของโลก (ขึ้นอยู่กับตำแหน่งของกล้องและตำแหน่งเมาส์) เราสร้างระนาบที่แกน x อยู่: ปกติคือ V cross X cross V โดยที่ V - เวกเตอร์จากกึ่งกลางไปยังกล้อง X - แทนแกน X จากนั้นเราก็ตัดรังสีกับระนาบดังนั้นเราจึงหาจุดตัดในพิกัดโลก จากนั้นเราฉายส่วนของแกน x และจุดผลลัพธ์กลับบนหน้าจอค้นหาระยะทางระหว่างส่วนที่ฉายและจุดที่ฉายบนหน้าจอ ถ้ามันน้อยกว่าสองสามพิกเซลเมาส์จะใส่แกนเข้าไป นอกจากนี้เรายังคำนวณเวกเตอร์พื้นที่เดลต้าโลกระหว่างศูนย์การเลือกและทางแยกของเรา

ขั้นตอนนี้เราใช้กับ 3 แกนดังนั้นเราจึงหาระยะทางไปยังแกนทั้งหมด ค้นหาระยะทางขั้นต่ำ ดังนั้นเราจึงพบว่าแกนของเมาส์อยู่ตรงไหน

2) เมื่อเลื่อนเมาส์ เรารู้ได้ว่าแกนเคลื่อนวัตถุใด (จาก 1) เราพบจุดตัดของอวกาศของโลกด้วยระนาบ (ดังใน 1) นอกจากนี้เราคาดการณ์จุดตัดบนเส้นที่วัตถุเคลื่อนที่ตาม ตำแหน่งหุ่นยนต์สุดท้าย = ทางแยก + เดลต้า

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