เพื่อสร้างภูมิประเทศ voxel
(a)วิธีการทั่วไปคือการสร้าง heightmap โดยใช้สัญญาณรบกวน Perlin ความสูงนั้นเป็นภาพขาวดำที่แสดงความสูงต่างกันโดยความมืดหรือความสว่างของพิกเซล
คุณจะดูที่พิกเซลแต่ละอันในแผนที่ความสูงนี้เพื่อสร้าง "สแต็ค" ของ voxels สูงถึงความสูงที่แตกต่างกัน (แกน z) ในสถานที่ที่แตกต่างกัน (x, y) ตามความสว่างของพิกเซลนั้นในรูปภาพของแผนที่ความสูง เนื่องจากภาพสัญญาณรบกวนของ Perlin นั้นราบรื่น (ไม่มีขอบที่คมชัดเมื่อเทียบกับความมืด) คุณจะได้ภูมิประเทศที่ราบรื่น
(b)คุณสามารถสร้างมันทีละส่วนได้โดยการสร้างภูมิทัศน์จากรูปทรงหลายเหลี่ยมที่แตกต่างกัน สร้างรูปร่างเวกเตอร์ polyhedral ที่ใกล้เคียงกับรูปร่าง voxel ที่คุณต้องการ ใช้วิธี 3D-point-in-polyhedron (ส่วนใหญ่เป็นจุดนูน - ฮัลล์) ตรวจสอบว่าจุดใดในตารางโลกของคุณตกอยู่ในปริมาตร polyhedral นั้น ตัวอย่างเช่นกำหนดปิรามิดในอวกาศ หลังจากตรวจสอบทุกจุดในพื้นที่ท้องถิ่นของพื้นที่โลกของคุณกับปริมาตรพีระมิดนั้นคุณจะรู้ว่าจุดใดที่อยู่ภายในและคุณสามารถตั้งค่าเซลล์เหล่านั้นให้เป็น "ปัจจุบัน" ซึ่งหมายความว่าพวกมันกลายเป็น voxels แทนพื้นที่ว่าง ตอนนี้คุณมีปิรามิด voxel ในอวกาศของคุณ คุณสามารถเพิ่มรูปร่างของการเรียงลำดับใด ๆ ต่อไปได้ด้วยวิธีนี้จนกว่าคุณจะได้สร้างภูมิประเทศ
(c) (จริงๆเหมือนกับb ) เขียนเครื่องมือสร้างแบบจำลอง Voxatronแสดงให้เห็นว่ามันจะเป็นอย่างไร นี่เป็นเพียงการสร้างรูปแบบ voxel ในโลกแห่งการทดแทน (บรรณาธิการ) แล้วนำเข้าสิ่งเหล่านี้เข้าสู่โลกเกมรันไทม์ที่แท้จริงของคุณ ฉันเชื่อว่าVoxlapมีเครื่องมือแก้ไขโอเพ่นซอร์สตัวแรกสำหรับ voxels คุณสามารถวาง voxels เดี่ยว ๆ หรือคุณสามารถใช้ "แปรง" voxel ที่มีรูปร่าง / ปริมาณที่แตกต่างกันเพื่อดึง voxels เข้าสู่โลกของคุณ
สิ่งที่คุณจะต้องสร้างเกมที่ใช้ voxel ของคุณเอง
ฉันรวมส่วนนี้ไว้เพราะถนน voxel นั้นไม่ง่ายอย่างน้อยก็ในปัจจุบัน เมื่อไม่นานมานี้มีการวิจัยจำนวนมากที่ถูกนำไปใส่ไว้ในเอ็นจิ้น voxel อีกครั้งโดยผู้เล่นรายใหญ่ไปสู่การเรนเดอร์และแอพพลิเคชั่นฟิสิกส์
เรียบง่ายอาจจะมีปัญหาเพราะแบบไดนามิกสร้างโลกออกจากชุดิบเป็นวิธีการขั้นตอนจะมีการก่อสร้างของโลกและนี้ไม่ง่ายอย่างโดยเนื้อแท้ ดังนั้นขออภัยจะมีคำศัพท์ทางเทคนิคเล็กน้อยที่นี่ การเขียนโปรแกรม voxel เป็นงานที่ค่อนข้างจริงจังและต้องการความรู้ในหลาย ๆ ด้านของการพัฒนาโปรแกรมเกมโดยเฉพาะอย่างยิ่งในแง่ของแนวคิดเชิงพื้นที่ซึ่งหมายถึงการเข้าใจคณิตศาสตร์เวกเตอร์ 3 มิติเมทริกซ์และแคลคูลัสพื้นฐานในระดับที่เหมาะสม
ต้องบอกว่า "การสร้างภูมิประเทศ voxel" ของคุณต้องใช้บริบทในการทำงานเนื่องจากเครื่องยนต์ voxel นั้นยังไม่แพร่หลายอย่างแน่นอน ให้คำอธิบายพื้นฐานของการทำงานของเอ็นจิ้น voxel
Voxels เป็นหน่วยการสร้างพื้นฐานของโลกของคุณ ตำแหน่งของพวกเขาจะถูกกำหนดโดยตาราง 3 มิติแบบจำนวนเต็ม (ดัชนี) แทนที่จะเป็นพื้นที่จุดลอยตัวต่อเนื่อง (ที่ใช้ในเกม 3D แบบอิงเวกเตอร์) สิ่งเหล่านี้จะเป็น "อะตอม" ในโลกของคุณ พวกมันอาจสูงถึง 3 ฟุตเหมือนกับในเกมอย่าง Minecraft หรืออาจเล็กกว่าที่ตัวละครเสมือนจริงของคุณเห็นได้เว้นแต่ว่าจะรวมกลุ่มกันเป็นจำนวนมาก - คล้ายโมเลกุลมากกว่า มีสองชนิด:
- ชุตามตาข่ายลูกบาศก์ ( ตัวอย่าง ) - เหล่านี้เป็นจัดเรียงใหม่ที่ใช้สำหรับความเรียบง่ายและใช้งานได้อย่างง่ายดายร่วมกับกราฟิกที่ทันสมัยไฮเทค ใช้ในเกมเช่น MineCrat และ Dungeon Keeper
- ชุพอยต์ ( ตัวอย่างเช่น , ตัวอย่าง ) - The voxel เดิม แต่ละจุดเป็นจุดแยกส่วนบุคคลในอวกาศแม้ว่ามันอาจจะถูกล้อมรอบด้วยปริมาตรขอบเขตทรงกลม มันง่ายกว่าดังนั้นคุณสามารถมีพวกมันได้มากมายในโลกของคุณและคุณสามารถทำให้มันเล็กลงซึ่งโดยทั่วไปแล้วเป็นสิ่งที่ดี สองเกมที่ใช้สิ่งเหล่านี้คือ Comanche และ 1990's remake of Lords of Midnight
ไม่ว่าจะด้วยวิธีใดวิธีการจัดการกับ voxels ในโลกของคุณก็เหมือนกันดังนี้
ในการสร้างและย้ายวัตถุในโลกของคุณคุณจะต้องใช้เครื่องมือทางคณิตศาสตร์ที่กล่าวถึงข้างต้น ตัวอย่างเช่นในการสร้างกำแพง: สร้างกล่องขนาดที่เหมาะสมในพื้นที่ 3D โดยใช้เวกเตอร์ ใช้เมทริกซ์คณิตศาสตร์เพื่อแปลงกล่องของคุณเป็นการหมุนและตำแหน่งที่คุณต้องการในโลก 3 มิติของคุณ (ในปริภูมิเวกเตอร์ต่อเนื่อง) สำหรับเอ็นจิ้น voxel ขั้นตอนเพิ่มเติมคือตอนนี้ใช้อัลกอริธึมแบบ point-in-polyhedron แบบ 3D เพื่อกำหนดว่า voxels ใดที่อยู่ในพื้นที่หมุนรอบนั้น
นี่คือวิธีที่คุณจะสร้างวัตถุส่วนใหญ่ในโลกของคุณ นอกเหนือจากนั้นคุณสามารถเขียนเครื่องมือของคุณเองเพื่อ "จำลอง" ตัวละครในแบบที่คุณอาจพูด Maya หรือ 3DS Max แต่เนื่องจากคุณกำลังสร้างโมเดลคุณจะทำให้ตัวละครไม่มี voxels แทนที่จะเป็นจุดขอบและใบหน้าวิธีการของคุณจะแตกต่างกันอย่างมาก หากคุณตัดสินใจที่จะหมุนวัตถุเหล่านี้ในโลกของคุณคุณจะต้องใช้การแปลงเมทริกซ์ในทำนองเดียวกันเพื่อทำเช่นนั้น
ภูมิประเทศที่ทำลายล้างได้ง่ายเพียงกำจัด voxel ทีละตัวตามวิธีการที่คุณเลือกหรือใช้การดำเนินงาน CSG (Constructive Solid Geometry) ในปริมาณมากของ voxels เพื่อลบออกตามปริมาณที่กำหนดไว้ล่วงหน้า ตัวอย่างเช่นหากยิงลำแสงเลเซอร์ทะลุก้อนหินคุณอาจใช้ปริมาตรทรงกระบอกเพื่อลบ voxels ที่นี่ลำแสงกำลังยิงทะลุก้อนหิน CSG เป็นกระบวนการที่ค่อนข้างง่ายโดยใช้กริดอวกาศ 3 มิติซึ่งก่อให้เกิดโลก voxel ของคุณและตรวจสอบทุกเซลล์ในส่วนของกริดพื้นฐาน (ในกรณีนี้คือหิน) เทียบกับกริดอื่น (ในกรณีนี้คือลำแสงเลเซอร์)
ในการที่จะมีวัสดุ "ไหล" (ตามที่ Vigil บอกไว้ในความคิดเห็นของเขาบนทราย) คุณจะต้องมองเข้าไปในพลศาสตร์ของไหลและออโตมาตาของเซลล์ สิ่งเหล่านี้ถูกใช้โดยผู้เขียนของ Dwarf Fortress, Tarn Adams ในสิ่งที่เป็นหลักของโลก voxel (แม้ว่า voxels จะมีขนาดใหญ่กว่ามากในกรณีนี้เปรียบได้กับ Dungeon Keeper หลักการยังคงเหมือนเดิม) เหล่านี้เป็นหัวข้อที่ทันสมัยและไม่จำเป็นสำหรับเครื่องยนต์ voxel ตามที่กำหนดดังนั้นฉันจะปล่อยให้สิ่งนี้เป็น "stub" สำหรับการวิจัยของคุณเอง
CSG และพลศาสตร์ของไหลนำมาซึ่งการเพิ่มประสิทธิภาพ เครื่องมือ Voxel กำลังอยู่ในระหว่างการพัฒนาใช้ประโยชน์จาก sparse voxel octrees (SVOs) ซึ่งเป็นวิธีการแบ่งพื้นที่ voxel ไปสู่การแก้ปัญหาที่แตกต่างกันตามที่ปรากฏในวิดีโอนี้ซึ่งแสดงให้เห็นถึงเครื่องยนต์ Atomontage ที่กำลังจะมาถึง การใช้ octrees / SVO นั้นมีความจำเป็นมากกว่าตัวเลือกการปรับให้เหมาะสมที่สุดเนื่องจากการประมวลผลค่าโสหุ้ยที่เกี่ยวข้องกับการประมวลผลกริดขนาดใหญ่หนึ่งชุด octree เป็นต้นไม้ (กราฟ acyclic กำกับ) ที่ทุกโหนดมีโหนดลูก 8 หรือศูนย์ขึ้นอยู่กับว่าพื้นที่ที่มันหมายถึงมีปริมาณทางกายภาพใด ๆ แผนภาพแสดงให้เห็นว่า octrees แบ่งพื้นที่ในรูปแบบชุอยู่ที่นี่
การใช้ voxel แบบโอเพ่นซอร์สที่ดีที่สุดที่ฉันรู้จักคือVoxlap Engineของ Ken Silverman ซึ่งใช้สำหรับ Voxelstein3D มันเขียนใน C ++ และดำเนินการกับ CSG สำหรับการเปลี่ยนรูปภูมิประเทศ