ก่อนหน้านี้ฉันได้ใช้การเดินขบวน cubes / tetrahedra เพื่อสร้าง IsoSurface มันใช้งานได้ ( YouTube ) แต่ประสิทธิภาพการทำงานแย่มากเพราะฉันไม่เคยได้รับการใช้งานระดับรายละเอียดที่แปรผันตามระยะทางในการดู
ฉันตัดสินใจที่จะมีอีกไปและทำอย่างถูกต้องในเวลานี้ ฉันเริ่มต้นด้วยการสร้าง OctreeNode ที่ทำงานดังนี้เมื่อBuild()
ถูกเรียก
- หากชิ้นเล็กเกินไปที่จะสร้างกลับมาทันที
- ทำงานถ้าพื้นผิวผ่านปริมาตรอันนี้
- ถ้าเป็นเช่นนั้นตัดสินใจว่าเราต้องการยก LOD (เพราะกล้องปิด)
- ถ้าเป็นเช่นนั้นให้วางไข่เด็ก 8 คนและเรียกกระบวนการเดียวกันกับพวกเขา
- ถ้าไม่สร้างตาข่ายโดยใช้ขนาดของโหนดปัจจุบัน
บาง PseudoCode:
OctNode Build() {
if(this.ChunkSize < minChunkSize) {
return null;
}
densityRange = densitySource¹.GetDensityRange(this.bounds);
if(densityRange.min < surface < densityRange.max) {
if(loDProvider.DesiredLod(bounds)² > currentLoD) {
for(i 1 to 8) {
if(children[i] == null) {
children[i] = new OctNode(...)
}
children[i] = children[i].Build();
}
} else {
BuildMesh();
}
return this;
}
}
¹เช่นเดียวกับความหนาแน่นกลับมาที่จุดแหล่งความหนาแน่นสามารถกำหนดช่วงความหนาแน่นที่เป็นไปได้สำหรับปริมาณที่กำหนด
²ผู้ให้บริการ LoD รับกล่องขอบเขตและคืนค่า LoD ที่ต้องการสูงสุดตามตำแหน่ง / frustum ของกล้องการตั้งค่าผู้ใช้ ฯลฯ ...
ดังนั้น ... ทั้งหมดนี้ใช้งานได้ดี การใช้ทรงกลมง่ายๆเป็นแหล่งความหนาแน่นและแสดงโหนดทั้งหมด:
และเพียงแค่ใบไม้:
อย่างไรก็ตามมีปัญหาสองสามประการ:
- ฉันต้องกำหนดปริมาณการเริ่มต้นขอบเขต (และยิ่งมีขนาดใหญ่ขึ้นการประมวลผลเพิ่มเติมที่ฉันต้องทำ)
- ที่รากของต้นไม้ฉันไม่รู้เลยว่าใบจะลึกแค่ไหนดังนั้นหมายเลข LoD ของฉันจะเริ่มต้นที่คุณภาพต่ำสุด (ราก) และเพิ่มขึ้นเมื่อชิ้นเล็กลง เนื่องจาก LoD นั้นสัมพันธ์กับปริมาณเริ่มต้นจึงไม่ได้ใช้งานมากนักเมื่อฉันต้องการทำสิ่งที่มีขนาด / คุณภาพที่เฉพาะเจาะจง
ฉันคิดว่ามีสองตัวเลือก แต่ทั้งคู่ดูเหมือนจะมีข้อบกพร่อง:
- เก็บสะสมของ Octrees และเพิ่ม / ลบขึ้นอยู่กับระยะทาง ไม่เห็นว่าฉันจะเชื่อมโยงไปยังทางอื่นได้อย่างไรและฉันต้องการรายชื่อโหนดว่างเปล่าที่รู้จักโดยเฉพาะถ้าฉันต้องการพื้นผิว 3 มิติตามอำเภอใจ (เพื่อหลีกเลี่ยงการคำนวณปริมาตรเปล่าซ้ำ ๆ )
- เพิ่มโหนดหลักไปยังรูทปัจจุบันจากนั้นเพิ่มเจ็ดพี่น้องสำหรับโหนดเดิม สิ่งนี้จะใช้งานได้และเป็นไปตามความต้องการ แต่ดูเหมือนว่าจะซับซ้อนเพื่อลดขนาดกลับลงอย่างสมเหตุสมผลเมื่อผู้เล่นเคลื่อนที่ผ่านแนวนอน มันจะทำให้ตัวเลข LoD มีความหมายน้อยลง
¹ [โดยการชี้แจงต่อ Q ด้านล่าง] ปัจจุบันถ้า 2 โหนดที่อยู่ติดกันในต้นไม้มี LOD ที่ต่างกันฉันมีรหัสที่จะบีบบังคับให้ verts ที่ไม่มีรอยต่อเมื่อตาข่ายถูกสร้างขึ้น ฉันสามารถทำได้โดยการรู้ความหนาแน่นของหลาย ๆ โหนด ในสถานการณ์ที่ฉันมีสองอิสระแปดด้านข้างกันฉันไม่มีวิธีที่ง่ายในการดึงข้อมูลนี้ทำให้เกิดตะเข็บ
อะไรคือวิธีที่เหมาะสมที่สุดในการเข้าถึงสิ่งนี้