ฉันจะกำหนดลำดับการวาดในเกมแฟลชมุมมองภาพสามมิติได้อย่างไร


12

นี่คือเกมแฟลชที่มีมุมมองภาพสามมิติ ฉันจำเป็นต้องรู้วิธีการเรียงลำดับวัตถุเพื่อให้ไม่จำเป็นต้องตรวจสอบบัฟเฟอร์ z เมื่อวาด สิ่งนี้อาจดูง่าย แต่มีข้อ จำกัด อื่นฉากหนึ่งอาจมีวัตถุมากกว่า 10,000 รายการดังนั้นอัลกอริทึมจะต้องทำงานในเวลาน้อยกว่า O (n ^ 2) วัตถุทั้งหมดเป็นกล่องสี่เหลี่ยมและวัตถุ 3-4 ชิ้นเคลื่อนที่ในที่เกิดเหตุ วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

UPDATE

ในแต่ละกระเบื้องมีเพียงวัตถุ (ฉันหมายถึงวัตถุไม่สามารถซ้อนทับกัน) และเราเข้าถึงทั้งแผนที่วัตถุและวัตถุมีตำแหน่งของตัวเอง

UPDATE2

ดูตัวเลขเหล่านี้:

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

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

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


2
คุณควรโพสต์ข้อมูลเพิ่มเติม วัตถุสามารถสแต็ก (3d)? วัตถุมีตำแหน่งหรือแผนที่มีวัตถุ? ฯลฯ
kaoD

2
เป็นเช่นเดียวกับgamedev.stackexchange.com/questions/8151/…
Tetrad

@ Tetrad ใช่ แต่มีความแตกต่างเล็กน้อยเกี่ยวกับวัตถุที่เราใส่เข้าไปในฉาก
Ali1S232

@Gajet (หลังจากอัปเดตของคุณ) วัตถุสามารถเป็น 1 * X และ X * 1 หรือ X * Y ได้หรือไม่ คุณสามารถแบ่งวัตถุออกเป็นหลาย ๆ วัตถุย่อยได้หรือไม่? (เช่นสีเขียวเป็นวัตถุย่อย 4 สีเขียว) การวางแนวของวัตถุได้รับการแก้ไขหรือไม่?
kaoD

นอกจากนี้: ความสูงของวัตถุของคุณปิดบังกระเบื้องที่อยู่ติดกันกี่แผ่น
kaoD

คำตอบ:


8

นี่เป็นเรื่องง่ายมากหากวัตถุของคุณจับคู่กับกระเบื้องภาพสามมิติของคุณ ดูรูปนี้:

ลำดับการวาดภาพสามมิติ

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

นี่เป็นปัญหาใหม่: คุณสามารถดูได้อย่างง่ายดายว่าความซับซ้อนของมันคือ O (N) โดยที่ N คือขนาดบอร์ดของคุณ ( N=W*H) เพื่อเอาชนะปัญหานี้เพียงแค่สร้างโครงสร้างข้อมูลเชิงเส้นใหม่ซึ่งแต่ละดัชนีในโครงสร้างของคุณตรงกับความลึกที่กำหนดให้อัปเดตเมื่อใดก็ตามที่วัตถุเปลี่ยนความลึก

กรณีที่วัตถุไม่ตรงกับไทล์เดี่ยวยากขึ้นเล็กน้อยดังนั้นฉันจะโพสต์ถ้าคุณต้องการทันทีที่คุณอัปเดตคำถามของคุณ


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

1
@Gajet และนั่นคือสิ่งที่คุณต้องโพสต์ในคำถามของคุณตั้งแต่แรก: P
kaoD

3
นี่คือวิธีที่จะไปแบ่งส่วนใหญ่ใน '
tile

2

ฉันไม่มีความรู้พิเศษในเรื่องนี้ แต่นี่เป็นความคิด

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

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

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


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

1

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

แก้ไข: วิธีนี้ใช้ไม่ได้หากคุณไม่สามารถวาดเนื้อหาของแต่ละเซลล์ได้


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

1

อะไรทำให้คุณเชื่อว่ามันเป็น“ พิสูจน์ได้ทางคณิตศาสตร์ว่ามีอย่างน้อยหนึ่งคำสั่งเพื่อสนองความต้องการของปัญหา”? นี่คือตัวอย่างเล็ก ๆ น้อย ๆ ที่คุณไม่สามารถเชื่อถือได้ในการเรียงลำดับวัตถุ z:

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


เพิ่งออกมาจากความอยากรู้อยากเห็น ... คุณช่วยอธิบายตัวอย่างตอบโต้ได้ไหม? นั่นไม่ใช่ตาราง
kaoD

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

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