โหมด 7เป็นเอฟเฟกต์ที่ง่ายมาก มันฉายภาพพื้นผิว 2 มิติ x / y (หรือกระเบื้อง) ไปยังพื้น / เพดานบางส่วน SNES เก่าใช้ฮาร์ดแวร์ในการทำเช่นนี้ แต่คอมพิวเตอร์สมัยใหม่นั้นทรงพลังมากจนคุณสามารถทำได้แบบเรียลไทม์ (และไม่จำเป็นต้องใช้ ASM ตามที่คุณพูดถึง)
สูตรคณิตศาสตร์ 3D พื้นฐานเพื่อฉายจุด 3D (x, y, z) ถึงจุด 2D (x, y) คือ:
x' = x / z;
y' = y / z;
เมื่อคุณคิดถึงมันมันก็สมเหตุสมผล วัตถุที่อยู่ในระยะไกลจะเล็กกว่าวัตถุที่อยู่ใกล้คุณ ลองคิดถึงเส้นทางรถไฟที่ไม่มีที่ใด:
หากเรามองกลับไปที่ค่าอินพุตสูตร: x
และy
จะเป็นพิกเซลปัจจุบันที่เรากำลังประมวลผลและz
จะเป็นข้อมูลระยะทางเกี่ยวกับจุดที่อยู่ไกล เพื่อให้เข้าใจสิ่งที่z
ควรดูที่ภาพนั้นจะแสดงz
ค่าสำหรับภาพด้านบน:
สีม่วง = ระยะทางใกล้, สีแดง = ไกลออกไป
ดังนั้นในตัวอย่างนี้z
ค่าคือ y - horizon
(สมมติว่า(x:0, y:0)
เป็นศูนย์กลางของหน้าจอ)
ถ้าเรารวมทุกอย่างเข้าด้วยกันมันจะกลายเป็น: (pseudocode)
for (y = -yres/2 ; y < yres/2 ; y++)
for (x = -xres/2 ; x < xres/2 ; x++)
{
horizon = 20; //adjust if needed
fov = 200;
px = x;
py = fov;
pz = y + horizon;
//projection
sx = px / pz;
sy = py / pz;
scaling = 100; //adjust if needed, depends of texture size
color = get2DTexture(sx * scaling, sy * scaling);
//put (color) at (x, y) on screen
...
}
สิ่งหนึ่งที่สุดท้าย: ถ้าคุณต้องการสร้างเกมมาริโอคาร์ทฉันคิดว่าคุณต้องการหมุนแผนที่ด้วย มันยังง่ายมาก: หมุนsx
และsy
ก่อนรับค่าพื้นผิว นี่คือสูตร:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
และถ้าคุณต้องการย้ายแผนที่รางเพียงเพิ่มการชดเชยบางส่วนก่อนที่จะได้รับค่าพื้นผิว:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
หมายเหตุ: ฉันทดสอบอัลกอริทึม (เกือบคัดลอกวาง) และใช้งานได้ นี่คือตัวอย่าง: http://glslsandbox.com/e#26532.3 (ต้องใช้เบราว์เซอร์ล่าสุดและเปิดใช้งาน WebGL)
NOTE2: ฉันใช้คณิตศาสตร์อย่างง่ายเพราะคุณบอกว่าคุณต้องการบางสิ่งที่เรียบง่าย (และดูเหมือนจะไม่คุ้นเคยกับคณิตศาสตร์เวกเตอร์) คุณสามารถทำสิ่งเดียวกันโดยใช้สูตรหรือแบบฝึกหัดที่คุณให้ วิธีที่พวกเขาทำมันมีความซับซ้อนมากขึ้น แต่คุณมีความเป็นไปได้มากขึ้นสำหรับการกำหนดค่าเอฟเฟกต์ (ในที่สุดมันก็ใช้งานได้เหมือนกัน ... )
สำหรับข้อมูลเพิ่มเติมฉันขอแนะนำให้อ่าน: http://en.wikipedia.org/wiki/3D_project#Perspective_project