Быстрая 3D-графика для SPECCY, реально ли это? Возможно, нижеследующая статья раскроет для Вас ранее неизвестные возможности SPECCY и окажется полезной при работе с трехмерными объектами. Статья рассчитана на более-менее подготовленных читателей, но может оказаться полезной даже начинающим пользователям...
Не смотря на некоторую хаотичность и недосказанность подачи информации, здесь описывается в определенной степени выдающийся способ работы с 3D объектами в реальном времени. Процедура примечательна тем, что работает очень быстро. Основная суть данного метода состоит в том, что вращается не каждая точка в отдельности, а сразу целая плоскость. Этот метод может пригодиться не только для создания крутых векторных эффектов, но и для написания новых игрушек. А как rulez'но будут смотреться старые векторные игры, переделанные с учетом последних кодерских достижений! Например, ELITE, работающая в 2-3 раза быстрее или плавнее!
Перейдем, собственно, к материалу, предоставленному RUFF'ом, еще до того как он почувствовал вкус написания игрушек на Amiga и стал успешно "кодить" там... Хорошим примером, иллюстрирующим описанный ниже алгоритм, является эффект из демо "Hallutinations in Opera" — вращающийся 3-D человек, состоящий из одних векторов.
Когда-то я прочитал статью в "ECHO 1" про вывод 3-D объектов. Там описан традиционный метод, который все (кто знает) используют. Это, конечно, очень интересно поворачивать точки вокруг осей X, Y и Z по специальным формулам.
Для поворота вокруг оси X:
Y' = COS(N) * Y - SIN(N) * Z
Z' = SIN(N) * Y + COS(N) * Z
Вокруг оси Y:
X' = SIN(N) * Z + COS(N) * X
Z' = COS(N) * Z - SIN(N) * X
Вокруг оси Z:
X' = COS(N) * X - SIN(N) * Y
Y' = SIN(N) * X + COS(N) * Y
(N - угол поворота)
У этого способа есть недостатки. А если точнее, один очень большой недостаток — занимает много времени! На операции умножения (какими бы быстрыми они не были) и вычисления COS и SIN (даже по таблице) уходит немало времени. Если учесть проблему со знаками и то, что обычно объекты вращают сразу вокруг трех осей (некоторые вообще используют калькулятор BASIC'а), то тут ничего не остается, кроме как сперва рассчитывать координаты, а потом выводить graphix. Некоторые даже подгружают отдельно рассчитанные на BASIC'е координаты. Это же lamer'ство! (Кроме отдельных случаев). Правда, иногда встречаются программки с REAL-TIME 3D CALCULATING'ом. Но как они тормозят!!!
...Это было вступление. Теперь ближе к делу. Я придумал новый способ вывода 3D объектов. Вот его достоинства:
- Он намного (!!!) быстрее вышеописанного способа. Чтобы вычислить координаты одной точки, нужно приблизительно 200 тактов (при желании можно сделать еще быстрее).
- 3D объект можно не только поворачивать, но и деформировать (растягивать, сжимать и т.д.).
Я не могу полностью привести здесь листинг этого эффекта, поэтому привожу все по кускам, которые вы сами соберете и дополните кому что надо.
Вот первый фрагмент — сама процедура печати 3D объекта:
PRINT:
LD (SAV+1),SP ; сохраняю SP
LD SP,...
; ... - Это начальный адрес координат точек 3D объекта. На одну точку 4 байта (3 байта - координаты X, Y, Z; 1 байт - старший байт таблицы осей (про нее чуть попозже). Он, кстати, дальше обозначается меткой TABAX).
EXX
LD HL,BUFER ; Специальный буфер для очистки экрана
; (смотри ниже)
LD B,175 ; кол-во точек-векторов
LP1
; Дальше идет процедура печати одной точки:
EXX
POP BC ; в BC - Y,X
POP HL ; в HL - старш. байт таблицы осей, Z
LD A,(HL)
LD E,L
LD L,B
INC H
ADD A,(HL)
INC H
LD L,C
ADD A,(HL)
ADD A,HX
LD C,A
INC H
LD A,(HL)
LD L,E
INC H
ADD A,(HL)
LD L,B
INC H
ADD A,(HL)
ADD A,LX
LD L,A
; Теперь координаты точек (X и Y в экране) вычислены и помещены в регистры C и L. Дальше идет процедура печати точки по координатам в этих регистрах (69 тактов). Для нее нужна специальная таблица, так; кто, кто такой процедуры не знает, может использовать свою.
PLOT:
LD H,TABLE_P
LD D,(HL)
INC H
LD A,(HL)
INC H
LD L,C
ADD A,(HL)
INC H
LD E,A
LD A,(DE)
OR (HL)
LD (DE),A
; Ну, вот. Точку напечатали, теперь можно (если хотите) в специальный буфер поместить адрес в экране этой точки (для того, чтобы потом быстро очистить экран методом POP HL: LD (HL),0: POP HL: LD (HL),0: POP HL...).
LD A,D
EXX
DEC HL ; Адрес буфера растет вверх-ногами (для удобства).
LD (HL),A
EXX
LD A,E
EXX
DEC HL
LD (HL),A
DJNZ LP1 ; Следующая точка.
SAV LD SP,0
RET
Как-то непривычно смотрятся команды LD SP,0 : RET, зато экономит память.
Вы, надеюсь, догадались, что эта процедура сама по себе ничего не даст. ЕЩЕ нужно написать процедуру очистки экрана и процедуру создания таблиц осей. Здесь я их не привожу по причине большего объема (длины), который они занимают. Очистку экрана я, конечно, мог бы написать, только касательно этого у каждого свои принципы (кто бы написал installer, кто поместил бы все в DUP'ы и т.д. и т.п.). Короче, сами напишите. А насчет создания таблиц с координатами осей, то лучше я сперва расскажу принцип.
Y ===== ....
________________ === == . .
/!^ ! == . .
/ !* ! === . .
/ !>48 ! === . .
/ !* ! === . .
! !* .А ! == . .
! !* ! === == . .
! !* ! ===== ....
! !* !
! !* ! рисунок 1
! !* !
! !* 32 !
! _______^________!
! 30/****************>/ X
! ^/* /
! /* /
!/<________________/
Посмотрите на РИСУНОК 1. Как вы догадались — это куб. Представьте, что внутри него находится 3-D объект. Каждая точка этого объекта имеет три координаты по осям Y, X и Z. Здесь оси не бесконечные. Например, они могут состоять из 64 точек (координат). То есть, точку можно задать тремя числами от 0 до 63. А теперь самое интересное...
Возьмем, например, точку А с координатами Y=48, X=32, Z=30. Как узнать ее координаты в экране, если учесть, что ось Z повернута так, как на рисунке? На каждой оси помечена точка с соответствующей координатой. Главное — нужно узнать координаты Y и X этих точек и центра (точка пересечения осей) на экране. Допустим, мы их знаем:
Координаты от левого верхнего угла Y,X:
На оси Y - 70,46
На оси X - 172,140
На оси Z - 180,40
Центр - 172,46
Чтобы вычислить координаты в экране точки "А", применяем две простые формулы:
Обозначим координаты в экране (то же, что выше, только вместо цифр буквы):
На оси Y - Yy, Xy
На оси X - Yx, Xx
На оси Z - Yz, Xz
Центр - Yc, Xc
Итак, формулы:
Y = (Yy - Yc) + (Yx - Yc) + (Yz - Yc) + Yc
X = (Xy - Xc) + (Xx - Xc) + (Xz - Xc) + Xc
Подставляем значения:
Y = (70 - 172) + (172 - 172) + (180 - 172) + 172 = 78
X = (46 - 46) + (140 - 46) + (40 - 46) + 46 = 134
Координаты точки "А" в экране 78,134.
Вышеприведенная программка печати 3D объекта именно это и делала — подсчитывала сумму (правда, немного по-другому), печатала точку и запоминала адрес в экране. А что же должна делать программа рассчитывания координат осей? — Конечно, рассчитывать координаты осей... Но давайте сперва разберемся с формулами... Вы, наверное, уже давно пораскрывали скобки, посокращали лишние координаты центра и уверены, что я это не заметил? Так вообще, можно сделать, только в этом мало смысла.
Вот в чем дело: тут от каждой координаты точки оси отнимается координата центра. Вернемся к координатам точек осей. Как вы догадались, придется рассчитывать координаты всех 64 точек осей. А эти координаты мы будем рассчитывать не так, как они есть в экране, а с центром с координатами в экране 0,0. А затем останется лишь прибавить координаты центра.
Сама процедура расчета координат осей занимает не много времени. У меня, например, (если процедуру поставить в начале прерывания) кадровая развертка не успеет дойти даже до первых строк экрана. Но для координат осей нужен буфер. Посчитаем его длину: одна ось - 64 точки, то есть 128 координат. Всего осей 3, значит, всего координат 128 * 3 = 384 координаты. Одна координата - один байт. Но ради ускорения вывода 3D спрайта, лучше координаты одной оси хранить в 512 байтах (координаты Y - 256 байт, координаты X - 256 байт. Из 256-ти байт используются только 64). Всего буфер выйдет 512 * 3 = 1536 байт. Тоже не очень много.
Ну, а теперь сама программа. Принцип работы будет объясняться по ходу дела. Как уже писалось выше, мы будем рассчитывать координаты осей так, если бы центр имел координаты 0;0. А потом уже, при выводе, прибавим координаты центра. Это сэкономит время. Кстати, координаты центра в моей программе будут храниться в регистровой паре IX, так что, ее содержание не меняйте, или сохраняйте, а затем восстанавливайте (моя программа рассчитывания координат осей связана с программой печати 3D спрайта парой IX и содержимым буфера координат осей).
AX
; Процедура рассчитывания координат осей. Координаты (в экране) крайних точек осей задаются в регистрах HL', BC, HL. Координаты центра в DE. Кстати, для тех, кто не хочет, чтобы 3D объект сжимался и растягивался, то может для поворота этих 4-х точек использовать формулы 3-D вращения (look up).
TABAX EQU 250 (64000 = 250 * 256)
; Старший байт буфера, в который рассчитываются координаты осей. Адрес буфера кратен 256 (!!!)
LD A,E
SUB 32
LD E,A
LD A,L
SUB 32
LD L,A
LD A,C
SUB 32
LD C,A
EXX
LD A,L
SUB 32
LD L,A
EXX
LD HX,D ; Имеется в виду ст. байт IX,
LD LX,E ; младший байт IX.
; (Недокументированные команды процессора Z-80. 6 тактов)
LD A,L
PUSH AF
LD A,C
PUSH AF
EXX
LD A,L
PUSH AF
EXX
LD A,H
PUSH AF
LD A,B
PUSH AF
EXX
LD A,TABAX
LD (VAR),A
LD A,H
LD B,HX
CALL K64
POP AF
LD B,HX
CALL K64
POP AF
LD B,HX
CALL K64
POP AF
LD B,LX
CALL K64
POP AF
LD B,LX
CALL K64
POP AF
LD B,LX
CALL K64
RET
K64
; K64 - самая главная процедура. Вызывается программой целых 6 раз. Просчитывает промежуточные 64 координаты. Координата цель в регистре A, а источник в B. Источник у нас центр, значит в B всегда координата центра (Y или X). А вообще здесь она нужна только для получения разницы (A - B или B - A) и для определения направления (положительное или отрицательное). Так как координаты центра у нас 0;0 - адрес таблицы в 64 байта (куда поместить все числа) кратный 256. Его старший байт задается по адресу VAR. Этот байт, кстати, програмка в конце сама увеличивает на 1. Так я рассчитывал сперва координаты Y, вызывая эту процедуру, а потом X-ы, вызывая ее еще раз. Осеей у нас три, поэтому процедура K64 вызывается 6 раз.
CP B
JP C,LOOP1
SUB B
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
EX DE,HL
LD HL,0
LOOP2
EXX
LD A,(VAR)
LD H,A
INC A
LD (VAR),A
LD L,0
EXX
DUP 64 ; или какой-нибудь цикл, типа
; LD B,64:...:DJNZ ...
LD A,H
ADD HL,DE
EXX
LD (HL),A
INC L
EXX
EDUP
RET
LOOP1
LD C,A
LD A,B
SUB C
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
EX DE,HL
LD HL,0
LOOP3
EXX
LD A,(VAR)
LD H,A
INC A
LD (VAR),A
LD L,0
EXX
DUP 64 ; или какой-нибудь цикл, типа
; LD B,64:...:DJNZ ...
SBC HL,DE
LD A,H
EXX
LD (HL),A
INC L
EXX
EDUP
RET
CP B
JP C,LOOP4
SUB B
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
EX DE,HL
LD H,B
LD L,0
JP LOOP2
LOOP4
LD C,A
LD A,B
SUB C
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
EX DE,HL
ADD A,C
LD H,A
LD L,0
JP LOOP3
VAR
NOP
NOP
Ну, вот и все... Для тех, кто не вник во все нюансы, или не хочет дополнительно менять, совершенствовать этот метод, а хочет написать все по-своему, некоторые рекомендации:
1. Не забудьте о формате хранения координат 3D объекта. Не забудьте про буферы (координат осей, delete буфер).
2. Координаты крайних точек осей (Kz, Kx, Ky и центр) считайте по формулам вращения или по синусоидной табличке.
3. Алгоритм программы вывода должен быть где-то таким:
EI
HALT
DI
CALL PRINT
Заносим в HL', BC, HL, DE следующие значения из син. таблицы (нужно еще учесть, чтобы они не были слишком большими, иначе спрайт может вылезти за экран и залезть с другой стороны).
CALL AX
Очистка экрана с использованием DELETE буфера.
Желательно приспособить все для работы с двумя экранами.
JP BEGIN
Оглавление издания: Rush #01
- AMIGA NEWS
Amiga Inc работает над Amiga OS 3.5 с улучшениями, такими как поддержка CD-дисков и PowerPC. Разработка разделена для процессоров M68K и PPC. Выпуск отложен на конец 1999 или начало 2000 года.
- AMIGA NEWS
Описание просмотрщика 'Fast JPEG 1.10' для Amiga, с акцентом на его особенности, установку и использование. Подчеркиваются преимущества, такие как быстрая обработка без потери качества, и предоставляются советы пользователям. Читателям предлагается делиться своими опытом использования программ.
- AMIGA NEWS
Основы программирования для классической Amiga, обсуждение сложностей и обмен знаниями в кодировании на Amiga. Обзор графических возможностей Amiga и особенностей процессоров. Введение в особенности ассемблера Amiga.
- AMIGA NEWS
Обзор событий, связанных с платформой Amiga, с начала до середины 1998 года. Включает новое оборудование, релизы программного обеспечения и заметные сотрудничества компаний. Будущие обновления и разработки запланированы для следующего выпуска.
- AMIGA NEWS
Подборка читов и секретов для классических игр Amiga, собранных Postcard Man. Читатели поощряются делиться своими находками в сложных играх. Предоставлены советы и коды уровней для различных игр.
- AMIGA NEWS
Обсуждение графических карт Phase-5 и возможностей процессора Permedia 2. Подробности о 2D/3D акселерации и совместимости Permedia 2. Упоминание процессоров GLINT Delta и сравнение цен и доступности.
- AMIGA NEWS
Анализ выживания Amiga в 90-х, подчеркивающий усилия сообщества и технологические достижения. Обсуждение аппаратных улучшений и разработки программного обеспечения. Поощрение дальнейшего изучения и освоения платформы Amiga.
- Spectrum программинг
Объяснение быстрого метода для 3D графики в реальном времени на ZX Spectrum. Вводятся эффективные техники вращения и деформации 3D объектов. Подчеркиваются улучшения по сравнению с традиционными методами с практическими примерами.
- Spectrum программинг - Ticklish Jim
Обсуждение совмещения звуковых эффектов с музыкой для AY-чипа Spectrum. Примеры из разработки 'CSC: Deja Vu' и технические трудности. Содержит практическое руководство и примеры кода.
- Spectrum программинг
Обсуждение зеркального отображения байтов и восстановления фона в программировании ZX Spectrum с примерами.
- Spectrum программинг
Подробное руководство для системных программистов с практическими советами по созданию эффективного и удобного ПО, включая техники кодирования, совместимость устройств и стратегии тестирования программ.
- Spectrum программинг
Совершенные методы кодинга и современные способы работы с графикой для ZX Spectrum. Советы по оптимизации графических процедур и программированию на ассемблере. Полезные рекомендации для программистов по улучшению производительности и эффективности.
- The End
Размышления о создании первого номера журнала 'Rush', его целях, аудитории и будущем развитии.
- ZX-SOFT - Вячеслав Медноногов
Обновления разработки новой игры 'Черный Ворон II' от Вячеслава Медного, включая изменения в игровом процессе, введение новых заклинаний и улучшения производительности.
- ZX-SOFT
Обзор новых возможностей обновленного командера от REAL software для ZX Spectrum, включая управление файлами, автодетекцию и просмотр медиа. Улучшения в работе с текстами, шрифтами и музыкой. Ответы на вопросы о будущих обновлениях.
- ZX-SOFT
Дебаты о том, какое демо заслуживало первое место на Funtop'98: Forever от DR или Refresh от XTM. Обсуждения в сообществе демосцены подчеркивают столкновение между техническим мастерством и концептуальной глубиной. Различные мнения отражают эволюцию предпочтений демосцены.
- Авторы
Благодарности авторам и партнёрам в создании журнала Rush. Подробные роли каждого автора и сотрудничество. Признание технической поддержки и медийных партнёрств.
- Виртуальный Спекки
Обсуждение конвертации графики с PC на Spectrum с мнениями различных экспертов. Описаны техники улучшения качества конверсии и инструменты, такие как Photoshop. Акцент на доработке после конверсии в графических редакторах Spectrum.
- Виртуальный Спекки
Обсуждение эмулятора CBSpeccy для ZX-Spectrum на Amiga, выделение его особенностей, мнений сообщества и технической производительности. Критика и похвалы за его эмуляционные возможности, особенно в сравнении с ПК эмуляторами. Рассмотрение возможных улучшений и дебаты в сообществе о обновлениях версий.
- Виртуальный Спекки
FAQ по эмуляции ZX-Spectrum на ПК, охватывающий популярные эмуляторы и форматы файлов. Инструкции по использованию различных эмуляторов и управлению типами файлов, такими как Hobeta и TR-DOS. Обсуждение российских ZX-ориентированных серверов и ресурсов для энтузиастов.
- Вступление
Вступление к журналу Rush, акцент на креативность, прогрессивную сцену и цель создать превосходный источник информации. Журнал стремится собрать перспективные группы и предложить уникальную перспективу. Основное внимание на содержании и атмосфере, приглашая создателей к сотрудничеству.
- Вступление - Grunge
Введение в Rush, новый сценовой журнал для любителей Speccy/Amiga, целью которого является предоставление качественного контента и новостей с поощрением обратной связи от читателей.
- Интервью - Konex
Интервью с группой ANTARES после FUNTOP-98. Обсуждение их демонстраций, трудностей и планов на будущее. Взгляд на формирование и динамику группы.
- Интервью - Kvazar, DUX
Интервью с Александром Селезневым (KVAZAR), обсуждение его истории с компьютерами, состояния сцены ZX Spectrum и будущих планов.
- Интервью - Kvazar
Интервью с витебской группой POWER о демо 'Crazy Love', опыте разработки и будущих проектах.
- Информацриум
Исследование CD с эмуляторами для различных платформ, с акцентом на Spectrum. Подробности об организации и разнообразии контента. Заключается инсайтами из коллекции программного обеспечения Spectrum CD-ROM Project.
- Информацриум
Подборка интересных и полезных интернет-адресов, связанных с ресурсами Amiga, включая журналы, производителей оборудования и компании-разработчики ПО.
- Информацриум - Viator
Обзор существующих и предстоящих изданий о платформе Amiga. Обсуждение доступности и проблем распространения литературы по Amiga. Призыв к сотрудничеству с новыми изданиями.
- О журнале
Обсуждение создания многоплатформенного журнала с акцентом на Spectrum, Amiga и ПК. Подчеркивается важность широкого понимания компьютерной сцены. Призыв к профессионализму и адаптации к изменяющимся технологиям.
- Параллельные миры
Обзор эволюции ОС Windows и процессоров ПК с 1981 по 2000 год. Вехи развития MS-DOS, Windows, процессоров Intel и конкуренции с AMD и Cyrix. Проблемы совместимости с новыми технологиями процессоров.
- Параллельные миры
Обзор моделей Macintosh и их значимость в области дизайна и графики, охватывающий цены и спецификации с 1997-1998 годов. Обсуждение включает эволюцию оборудования Apple, особенно серию PowerMac, и сравнивает новые процессоры G3 с аналогами для ПК. Подчеркивается возрождение Macintosh после кризиса и его продолжающееся влияние на рынок.
- Развитие Spectrum - Slider
Статья обсуждает новое графическое расширение для ZX Spectrum, расширяющее палитру цветов без увеличения ресурсных требований. Используя модифицированный сигнал flash, создаются новые цвета без нарушения совместимости с существующим софтом. В статье даются подробности реализации и решения практических вопросов.
- Развитие Spectrum
Подключение CDOS-модема к компьютеру 'Компакт-128' через устранение конфликтов порта клавиатуры. Описание аппаратных модификаций для решения проблемы. Решение включает автоматическую блокировку с использованием транзисторного инвертора.
- Развитие Spectrum - Ars
Обсуждение разработки AZX-Monstrum 512K, его аппаратной совместимости, вариантов процессора и потенциальных улучшений в графике и ОС.
- Развитие SPECTRUM
Обсуждение новой компьютерной платформы ZX2000 от Клайва Синклера, предназначенной для превосходства над ПК за счет скорости, доступности и эффективности батареи.
- Развитие Spectrum - Андрей Савичев
Рассмотрение эволюции и продолжающейся актуальности процессора Z80, и его роли во встроенных системах. Сравнение Z80 с его преемниками, выделение таких преимуществ, как энергоэффективность и улучшенные команды. Обзор интегрированных процессоров на базе Z80 и их периферийных устройств.
- Реклама
Статья представляет собой рекламу продукции Scorpion, включая оборудование для ZX Spectrum и программное обеспечение для Amiga, с подробностями цен и заказов.
- Реклама
Коллекция объявлений о продаже оборудования и программного обеспечения для Amiga и ZX Spectrum, с контактной информацией продавцов и подробностями о подписке на новый журнал Amiga.
- Реклама
Реклама музыкальной платы General Sound от X-TRADE. Содержит цены, технические характеристики и инструкции по покупке. Включает FAQ и информацию о совместимости.
- Смысл без смысла - Viator
Философские размышления об экзистенциализме, бессмертии и человеческой судьбе. Повествование переплетается с историями о честолюбии, поиске вечной жизни и утопическом падении. Сочетание интроспекции и спекулятивной фантастики.
- Сцена vs профессионалы
Исследование творчества демосцены в сравнении с коммерческой разработкой игр. Обсуждение потенциала создания профессиональных программ участниками сцены. Призыв к сотрудничеству с ведущими группами сцены.
- Сценохрония - Андрей Савичев
Размышления о неизменной привлекательности ZX Spectrum, устойчивости его сообщества и возможном возрождении в России.
- Сценохрония
Обзор деятельности группы Rush, включая прошлые проекты, текущие начинания и будущие планы, с акцентом на разработку ПО и игр.
- Сценохрония
Статья обсуждает различные новости сцены ZX Spectrum, включая релизы игр, демопати и обновления от разработчиков и команд.
- Сценохрония
Статья обсуждает международный фестиваль компьютерного искусства FUNTOP'98, прошедший в Москве, подчеркивая ключевые события, заметных участников и различные конкурсы, проведенные в ходе мероприятия.
- Сценохрония
Обсуждение развития сцены Amiga через сотрудничество, решение проблемы изоляции пользователей и расширение сети.
- Управление оболочкой
Статья описывает управление оболочкой для ZX Spectrum и Amiga, включая клавиши и функции навигации. Упоминаются особенности работы на Amiga с PAL монитором и предоставляется контакт для поддержки. Также отмечено, что текстовые файлы имеют стандартную MS-DOS кодировку.