Chế độ 7 là một hiệu ứng rất đơn giản. Nó chiếu một kết cấu 2D x / y (hoặc gạch) lên một số sàn / trần. SNES cũ sử dụng phần cứng để làm điều này, nhưng máy tính hiện đại mạnh đến mức bạn có thể thực hiện thời gian thực này (và không cần ASM như bạn đề cập).
Công thức toán học 3D cơ bản để chiếu một điểm 3D (x, y, z) thành điểm 2D (x, y) là:
x' = x / z;
y' = y / z;
Khi bạn nghĩ về nó, nó có ý nghĩa. Các đối tượng ở xa khoảng cách nhỏ hơn các đối tượng gần bạn. Hãy suy nghĩ về đường ray xe lửa sẽ đi đến đâu:
Nếu chúng ta nhìn lại các giá trị đầu vào của công thức: x
và y
sẽ là pixel hiện tại mà chúng ta đang xử lý và z
sẽ là thông tin về khoảng cách về điểm đó. Để hiểu những gì z
nên được, nhìn vào hình ảnh, nó hiển thị z
các giá trị cho hình ảnh ở trên:
tím = khoảng cách gần, đỏ = xa
Vì vậy, trong ví dụ này, z
giá trị là y - horizon
(giả sử (x:0, y:0)
nằm ở giữa màn hình)
Nếu chúng ta đặt mọi thứ lại với nhau, nó sẽ trở thành: (mã giả)
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
...
}
Một điều cuối cùng: nếu bạn muốn làm một trò chơi mario kart, tôi cho rằng bạn cũng muốn xoay bản đồ. Nó cũng rất dễ dàng: xoay sx
vàsy
trước khi nhận được giá trị kết cấu. Đây là công thức:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
và nếu bạn muốn di chuyển máng bản đồ, chỉ cần thêm một chút bù trước khi nhận giá trị kết cấu:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
LƯU Ý: tôi đã thử nghiệm thuật toán (gần như sao chép-dán) và nó hoạt động. Dưới đây là ví dụ: http://glslsandbox.com/e#26532.3 (yêu cầu trình duyệt gần đây và bật WebGL)
CHÚ THÍCH 2: Tôi sử dụng toán đơn giản vì bạn nói rằng bạn muốn một cái gì đó đơn giản (và dường như không quen thuộc với toán vector). Bạn có thể đạt được những điều tương tự bằng cách sử dụng công thức wikipedia hoặc hướng dẫn bạn đưa ra. Cách họ thực hiện nó phức tạp hơn nhiều nhưng bạn có nhiều khả năng hơn để định cấu hình hiệu ứng (cuối cùng thì nó cũng hoạt động tương tự ...).
Để biết thêm thông tin, tôi khuyên bạn nên đọc: http://en.wikipedia.org/wiki/3D_projection#Pers perspective_projection