การผสานรูปทรงเรขาคณิต / ตาข่ายโดยไม่สูญเสียผลประโยชน์


11

ใน three.js เราสามารถรวมรูปทรงเรขาคณิตเพื่อ จำกัด จำนวนการเรียกสายและเพิ่มประสิทธิภาพ ในการทดสอบอย่างง่าย ๆ ด้วยวัสดุชิ้นเดียวฉันสามารถวาด 50.000 คิวบ์ + เงา @ 60fps บน GPU GTX660 ของฉัน โดยไม่มีการผสานเรขาคณิต 5.000 ลูกบาศก์ทำให้เกิดปัญหาอยู่แล้ว

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

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

สิ่งที่ฉันต้องการทำสั้น ๆ

  • SimCity เช่นเกมเพื่อการเรียนรู้
  • บ้านแต่ละหลังเป็นตาข่ายลูกบาศก์
  • ต้องการสร้างบ้าน 50,000 หลังและสามารถเพิ่มและลบบ้านได้
  • การเลือกเฮ้าส์ด้วยเคอร์เซอร์ของเมาส์ (การหยิบ) จะต้องเป็นไปได้

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

คำตอบ:


11

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

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับการเลือกฉันใช้การดำเนินการแปดครั้งนี้: http://threejs.org/examples/#webgl_octree_raycasting

วิธีนี้จะทำให้การทดสอบทางแยกลงต่อการอัปเดตลดลงจาก 50,000 ถึง ~ 500 หากไม่มี octree ค่า fps จะลดลงอย่างมาก

ตัวถังเก็บสีส้มที่คุณเห็นเป็นจริงตาข่ายที่แสดงผลในขณะนี้ (+1 ดึงสาย) ด้วยวัสดุที่เปลี่ยนแปลงและขนาดที่ปรับเปลี่ยน

ป้อนคำอธิบายรูปภาพที่นี่

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


ขอบคุณมากสำหรับข้อมูลเชิงลึกนี้ ฉันพยายามหาวิธีที่จะทำเช่นนี้และฉันคิดว่าทางออกของคุณที่นี่ยอดเยี่ยมที่สุด! แต่คำถามด่วน: สำหรับรายการวัตถุในพื้นที่ของคุณ (เช่น Three.Object3D) คุณสมบัติใดที่จำเป็นสำหรับ rayCaster.intersectObjects ()
AlvinfromDiaspar

ทำได้ดีมาก
ClassicThunder

ฉันมีปัญหาที่คล้ายกัน แต่อย่างใดไม่สามารถทำงาน raycasting ด้วย r70 คุณทำอะไรเป็นพิเศษในขณะที่สร้างและผสานกล่องหรือไม่ ฉันใช้รหัสต่อไปนี้ ( pastebin.com/PStaAF3P ) เพื่อสร้างและรวมโหนด แต่อาจมีบางอย่างที่ขาดหายไปเพื่อให้ raycaster ทำงาน?
fhahn

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

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

1

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

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


0

ฉันไม่แน่ใจเกี่ยวกับรายละเอียดของ three.js แต่หมูที่มีประสิทธิภาพเป็นไปได้สองแบบนั้นต้องนึกถึง OpenGL ทั่วไป:

  1. คุณเคยคิดว่าจะอินสแตนซ์หรือไม่? คุณจะต้องใช้การโทรเพียงครั้งเดียวเช่นกันและใช้ VRAM น้อยลง
  2. คุณลองดูขั้นตอนวิธีการหยิบอย่างจริงจังหรือไม่? หากคิวบ์ของคุณมีการ จำกัด ปริมาณในรายการแทนต้นไม้เช่นที่จะอธิบายความแตกต่างของขนาดนั้น

0

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

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