Вершины дрожать будут?
Вид для печати
По опыту: младшим байтом таблицы лучше адресовать радиус, а старшим- угол поворота. Ибо гранулярность угла (~6 градуса для 16к-таблицы и ~3 градуса для 32к-таблицы) не так мешает, как ограничение на длину. Тем более что для маленьких радиусов половина таблицы будет иметь одинаковые значения.
В разделе кодинга TaganNews две статьи писал на эту тему. С примерами.
Надо смотреть.
При малых шагах по углам вращений и низком фпс наверняка будут.
но если подобрать шаги и достаточно динамично по фпс сделать то незаметно дрожания.
а вообще да, никто не мешает как Vitamin предложил взять диапазон угла 64 (старший байт адреса таблицы), а диапазон координат 128 (младший).
И хранить тока coord*cos(alpha), а sin получать увеличением угла на нужное значение. А по адресам где младший байт больше 128 хранить проекции без добавления X0,Y0 (при этом в старшем байте берем Z/2)
В принципе можно и для чанков так сказать из большего в меньшее, т.е. в таблице храним проекции поделенные на коэффициент.
А-а, ну нафик, слишком сложно для меня.
Да и демка не игра, заранее просчитать координаты, сцена будет динамичнее и зрелищнее.
Все равно два с половиной человек поймет, что оно не совсем реалтайм, а кому-то что то доказывать... ушли уже те времена.
везде и всегда!
честная математика для 3D у нас сделана в HARM, TRAUMWERK и WEED - причем в WEED используется немного измененные исходники из Spectrum Expert'a (X-Trade). В чанковом 3D движок я писал полностью сам, но опирался опять же на x-trade'овские сорцы - отличие в скорости есть, но не сказать что сильно уж значительное. Еще использовались некоторые математические процедуры от Baze/3SC (немного оптимизированные), которые можно посмотреть у него на страничке.
Вспоминаем IRIS :) Часть 3.5MHz называется :)
http://zxaaa.untergrund.net/DISKI/disk50.zip
Поворот одной точки по трем осям (оптимизация возможна):
И расчет таблицы:Код:;IX - pointer to <x,y,z> coords (input)
;IY - pointer to <x,y> coords (output)
LD A,(RX)
AND 252
RRA
SCF
RRA
LD H,A
LD L,(IX+1) ;Y
LD B,L
LD C,(HL) ;Y*SIN(RX)
LD L,(IX+2) ;Z
LD E,(HL) ;Z*SIN(RX)
LD A,H
ADD A,16
AND 191
LD H,A
LD A,(HL) ;Z*COS(RX)
ADD A,C
LD C,A ;Z'= Z*COS(RX)+Y*SIN(RX)
LD L,B ;Y
LD A,(HL) ;Y*COS(RX)
SUB E
LD E,A ;Y''=Y*COS(RX)-Z*SIN(RX)
LD A,(RY)
AND 252
RRA
SCF
RRA
LD H,A
LD L,C
LD C,(HL) ;Z'*SIN(RY)
LD A,H
ADD A,16
AND 191
LD H,A
LD L,(IX) ;X
LD A,(HL) ;X*COS(RY)
ADD A,C
LD C,A ;X''=X*COS(RY)+Z'*SIN(RY)
LD A,(RZ)
AND 252
RRA
SCF
RRA
LD H,A
LD L,C
LD B,(HL) ;X''*SIN(RZ)
LD L,E
LD E,(HL) ;Y''*SIN(RZ)
LD A,H
ADD A,16
AND 191
LD H,A
LD A,(HL) ;X''*COS(RZ)
ADD A,B
ADD A,96
LD (IY+1),A ;Y'''
LD L,C
LD A,(HL) ;Y''*COS(RZ)
SUB E
ADD A,128
LD (IY),A ;X'''
INC IX
INC IX
INC IX
INC IY
INC IY
Код:DECRUNT LD HL,#8000
DCR PUSH HL
LD A,H
SUB #80
ADD A,A
ADD A,A
LD H,L
CALL HSINA
POP HL
LD (HL),A
INC HL
LD A,H
CP 192
JR NZ,DCR
RET
HSINA ;A=H*SIN A
LD D,'SINUS
LD E,A
LD A,(DE)
HMULAA AND A
JP M,NEGE
BIT 7,H
JR Z,ALPOS
EX AF,AF'
LD A,H
NEG
LD H,A
EX AF,AF'
JR NEGRES
ALPOS CALL MULS
ADD HL,HL
LD A,H
RET
NEGE NEG
BIT 7,H
JR Z,NEGRES
EX AF,AF'
LD A,H
NEG
LD H,A
EX AF,AF'
JR ALPOS
NEGRES CALL MULS
ADD HL,HL
LD A,H
NEG
RET
HMULA AND A
JP M,NEGE1
BIT 7,H
JR Z,ALPOS1
EX AF,AF'
LD A,H
NEG
LD H,A
EX AF,AF'
JR NEGRES1
ALPOS1 CALL MULS
ADD HL,HL
RET
NEGE1 NEG
BIT 7,H
JR Z,NEGRES1
EX AF,AF'
LD A,H
NEG
LD H,A
EX AF,AF'
JR ALPOS1
NEGRES1 CALL MULS
ADD HL,HL
LD A,H
CPL
LD H,A
LD A,L
CPL
LD L,A
INC HL
RET
MULS ;HL=H*A
LD L,0
LD D,L
LD E,A
CWERT DUP 8
ADD HL,HL
JR NC,$+3
ADD HL,DE
EDUP
RET
смешные вы.. тут думаешь, что 256 итераций поворота то мало для красивых эффектов, а вы это чистло до 64 сокращаете..