ฉันจะใช้แสงที่ถูกบดบังในเกม 2D แบบบล็อกได้อย่างไร


11

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

สมมติว่าฉันมีโลก 10x10 และฉันวางแสงที่ 1x1 และผนังรอบ ๆ แสงนั้น ฉันต้องการที่จะเห็นแหล่งกำเนิดแสงที่ 1x1 แต่ไม่ใช่ที่อื่นเพราะมันถูกบล็อกโดยกำแพง

ฉันเคยได้ยินว่าการฉายรังสีแสงทำงาน แต่มันทำงานอย่างไรจริง ๆ ?


1
ต้องการดูคำตอบที่ไม่เชื่อเรื่องภาษาสำหรับคำถามนี้
Dashto

2
@Dashto: คุณจำเป็นต้องมีรหัสในการใช้งานภาษาที่คุณใช้? นี่เป็นสถานที่ที่ผิดที่จะขอ ..
Kromster

คุณลองทำอะไร เมื่อคุณพูดว่า "ที่อื่นไม่มีแหล่งกำเนิดแสง" คุณหมายถึงอะไร เพิ่งสว่างขึ้นคุณ 1,1 บล็อกและนั่นมัน บางทีฉันอาจไม่ได้รับคำถามของคุณคุณสามารถโพสต์ภาพประกอบได้ไหม?
Laurent Couvidou

1
@ Krom Stern: ฉันขอตรงกันข้ามแน่นอน - คำตอบแนวคิดที่ไม่ขึ้นอยู่กับภาษา เธรดทั้งสองที่เชื่อมโยงกันเนื่องจากรายการซ้ำไม่ได้พูดถึงแนวคิดมากนัก อันที่จริงคำถามที่คล้ายกันส่วนใหญ่ในเว็บไซต์นี้มีคำตอบว่า "ใช้ห้องสมุดนี้!" ซึ่งมีประโยชน์น้อยกว่าสำหรับคนที่ต้องการเข้าใจวิธีการทำงาน
Dashto

@Dashto: นั่นเป็นชิ้นส่วนสำคัญของข้อมูลที่คุณควรเพิ่มว่าคำถามที่;)
Kromster

คำตอบ:


13

Amit Patel ได้เขียนบทความที่ดีมากเกี่ยวกับการคัดเลือกนักแสดงเรย์ 2D

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

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

ตัวอย่างภาพทั้งหมดเป็นแบบโต้ตอบในโพสต์และเข้าใจง่ายมาก

คุณไม่จำเป็นต้อง จำกัด ตัวเองไว้ที่กล่องใดกล่องหนึ่งขอบเขตที่คุณติดตามอาจมีรูปร่างที่คุณชอบ


1

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

นี่คือลักษณะที่ปรากฏ


ฉันเพิ่งถามว่าฉันจะใช้การคัดเลือกเรย์ได้อย่างไร ฉันรู้เกี่ยวกับมัน
LiquidFeline

0

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

ขั้นแรกให้สร้างวัตถุที่มีแสงน้อย วางแสงของคุณที่พิกัด x, y

#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
    lightOccludingVertices[i] = vertex;
    i++;
}

//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest 
//vertex on the x-axis, and the furthest vertex on the y-axis

สิ่งนี้ไม่ได้รับประกันว่าจะสามารถใช้งานได้กับรูปหลายเหลี่ยมแบบเว้า แต่มันก็ใช้ได้ดีสำหรับรูปหลายเหลี่ยมนูนใด ๆ

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

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

ข้อมูลเพิ่มเติมเกี่ยวกับรูปหลายเหลี่ยมเว้าและนูน

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