|
Info Guide
#07
31 мая 2005 |
|
Gamedev - 3D проецирование пола/трассы в играх.

3D проецирование пола/трассы В Wolf'2004 пола нет, а в существующих на ZX гонках он хотя и есть, но нечестный (по нему нельзя ездить поперёк трассы и в обратном направлении). Настоящий пол нужно получать перспективным проецированием на экран картинки (трассы) достаточно большо─ го размера. Newart> Игровое окно занимает,допустим, 160 пи- кселей, половину окна занимает спроеци- рованный ландшафт, длина его, наверно, до проецирования раза в 3 больше,чем видно на экране после проецирования. Объясни, как ты предлагаешь сделать без ротации... Alone Coder> Ротация будет, но в процессе переноса графики в chunkmap. Т.е. 2 прохода: 1. rotate; 2. вывод чанков. Newart> А проецирование будет во время вывода чанок? Alone Coder> Проецирование во время ротации. Пусть высота земли = 80 пикселей ( 40 чанков). Расстояния,на которых видны выво─ димые горизонтальные линии, относятся друг к другу как 40/40, 40/39, 40/38 и т.д.,по─ следняя линия - 40/1. Допустим, что карта имеет размер, ну,хотя бы 256x512 пикселей. Пусть 4 самых задних линии земли не видны (серые), а видим мы на расстояние не более 1/3 карты (зависит от высоты наблюдателя). Тогда при чанках 2x4 на самых ближних ли─ ниях будут различимы пиксели текстуры, но получатся они размером не более 2 чанков, если я не обсчитался. Т.е. ОЧЕHЬ ДАЖЕ тер- пимо... Внутри каждой горизонтальной линии эк─ рана мы движемся по текстуре равномерно, равными приращениями. Перед выводом линии нужно только рассчитать её начало на текс─ туре и вектор движения по текстуре (и то,и другое можно высчитать по таблицам). Математика тут ничего из себя не предс─ тавляет. Обозначим координаты игрока через x0, y0, а его угол поворота - через a. Условно определим ось z от середины экрана вниз, масштаб - любой. Тогда расстояние по карте до точки, ко─ торую нужно вывести в середине горизонтали z, равно: d(z)=k1/z, где k1 - некий коэф─ фициент (он зависит от высоты игрока над поверхностью). Координаты этой точки на карте, если их отсчитывать от координат игрока, равны: cx(z,a)=d(z)*cos(a); cy(z,a)=d(z)*sin(a). Шаг,с которым мы будем проходить карту, рисуя горизонталь z, равен: step(z)=k2/z, где k2 - некий другой коэффициент (отноше─ ние k1/k2 определяет прямоугольную "вытя─ нутость" изображения). Составляющие этого шага по x и y равны: stepx(z,a)=step(z)*sin(a); stepy(z,a)=-step(z)*cos(a). Тогда понятно,что левая точка нашей ли─ нии z на карте будет иметь координаты: leftx(z,a)=cx(z)-width*stepx(z,a); lefty(z,a)=cy(z)-width*stepy(z,a). То есть вместо математики может быть просто таблица значений stepx,stepy,leftx, lefty размером 36*64 (остальные 192 угла a можно свести к этим 64 углам простыми об─ менами координат и сменами их знаков).Пос─ кольку эти числа 16-битные,то таблица зай─ мёт 18 килобайт (можно разложить по стра─ ничкам - особая скорость здесь не нужна).А все вычисления "на лету" сведутся к прос─ тому прибавлению координат игрока (x0, y0) к прочитанным из таблицы координатам. Главное - разбиение карты на "знакомес─ та" (тайлы). Предположим, что тайл равен 16(Y)*8(X) текселей (текстурных элементов, пикселей). Храниться они будут по адресам %0110yyyyxxxttttt, где yyyy,xxxx - коорди- наты внутри тайла, ttttt - номер тайла. Тогда карта будет 16*128=2048(Y) на 8*256= =2048(X). Проецирование идёт в чанковый буфер (потом можно будет накладывать спрайты). width=24 ;CHRS (DUP width) ADD IX,DE ;Y EXX ADD HL,BC ;X LD E,H ;X LD D,HX ;Y (set 7,d) ;чтобы не зашкал.за карту LD A,(DE) ;номер тайла, стоящего в ;этом месте карты XOR L ;мл.байт X (внутри тайла) AND #1F XOR L ;A=%xxxttttt EXX LD L,A LD A,LX ;мл.байт Y (внутри тайла) RRA SCF RRA SCF RRA OR A RRA ;A=%0110yyyy LD H,A ;HL=адрес текселя в тайле LD B,(HL) ;цвет чанка ;и ещё раз: ADD IX,DE ;Y EXX ADD HL,BC ;X LD E,H ;X LD D,HX ;Y (set 7,d) ;чтобы не зашкал.за карту LD A,(DE) ;номер тайла, стоящего в ;этом месте карты XOR L ;мл.байт X (внутри тайла) AND #1F XOR L ;A=%xxxttttt EXX LD L,A LD A,LX ;мл.байт Y (внутри тайла) RRA SCF RRA SCF RRA OR A RRA ;A=%0110yyyy LD H,A ;HL=адрес текселя в тайле LD C,(HL) ;цвет чанка PUSH BC ;кладём 2 чанка в чанкмэп (EDUP) Точность расчётов = 1/8 текселя. Вывод чанков на экран: (DUP width) POP HL ;цвета двух чанков: ;%1111aaa1,%1111bbb1 LD A,(HL) LD (BC),A LDD ;DE=BC+256 (или наоборот) (EDUP) Можно чередовать вывод чанков с проеци─ рованием после каждой строчки картинки - но тогда без спрайтов на экране.Хотя можно выводить их хитро, тоже по строчке. Размер чанкмэпа (включая верхнюю поло─ вину, где карта не рисуется): 48(2*width)*80(hgt)=3840. Памяти не осталось, поэтому можно испо─ льзовать 2-й экран,а можно уменьшить карту по Y в два раза (до размера странички) - добавить ещё SET 6,D. Вообще-то эти SET - дело вкуса, можно просто не давать игроку приближаться к границе карты. A. Coder
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3