मोड 7 एक बहुत ही सरल प्रभाव है। यह किसी मंजिल / छत पर 2D x / y बनावट (या टाइलें) का निर्माण करता है। पुराने एसएनईएस ऐसा करने के लिए हार्डवेयर का उपयोग करते हैं, लेकिन आधुनिक कंप्यूटर इतने शक्तिशाली हैं कि आप इस रियलटाइम (और एएसएम की आवश्यकता नहीं है जैसा कि आप उल्लेख कर सकते हैं)।
एक 3 डी बिंदु (x, y, z) को 2 डी बिंदु (x, y) प्रोजेक्ट करने के लिए मूल 3 डी गणित सूत्र है:
x' = x / z;
y' = y / z;
जब आप इसके बारे में सोचते हैं, तो यह समझ में आता है। दूर की वस्तुएं आपके आस-पास की वस्तुओं से छोटी होती हैं। कहीं जाने वाली रेल की पटरियों के बारे में सोचें:
यदि हम सूत्र इनपुट मानों पर वापस नज़र डालते हैं: x
और y
वर्तमान पिक्सेल हम प्रसंस्करण कर रहे हैं, और z
बिंदु कितनी दूर है, इसके बारे में दूरी की जानकारी होगी। यह समझने के लिए कि क्या z
होना चाहिए, उस चित्र को देखें, यह z
ऊपर की छवि के लिए मान दिखाता है:
बैंगनी = निकट दूरी, लाल = दूर
इसलिए इस उदाहरण में, z
मान y - horizon
( (x:0, y:0)
स्क्रीन के केंद्र में है)
यदि हम सब कुछ एक साथ करते हैं, तो यह बन जाता है: (स्यूडोकोड)
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_projection#Perspective_projection