По опыту: младшим байтом таблицы лучше адресовать радиус, а старшим- угол поворота. Ибо гранулярность угла (~6 градуса для 16к-таблицы и ~3 градуса для 32к-таблицы) не так мешает, как ограничение на длину. Тем более что для маленьких радиусов половина таблицы будет иметь одинаковые значения.
В разделе кодинга TaganNews две статьи писал на эту тему. С примерами.
Надо смотреть.
При малых шагах по углам вращений и низком фпс наверняка будут.
но если подобрать шаги и достаточно динамично по фпс сделать то незаметно дрожания.
а вообще да, никто не мешает как Vitamin предложил взять диапазон угла 64 (старший байт адреса таблицы), а диапазон координат 128 (младший).
И хранить тока coord*cos(alpha), а sin получать увеличением угла на нужное значение. А по адресам где младший байт больше 128 хранить проекции без добавления X0,Y0 (при этом в старшем байте берем Z/2)
В принципе можно и для чанков так сказать из большего в меньшее, т.е. в таблице храним проекции поделенные на коэффициент.
Pentagon1024sl2.2/TSFM/Z-Controller/GS128Kb/HDD/CDROM/Palcoder
А-а, ну нафик, слишком сложно для меня.
Да и демка не игра, заранее просчитать координаты, сцена будет динамичнее и зрелищнее.
Все равно два с половиной человек поймет, что оно не совсем реалтайм, а кому-то что то доказывать... ушли уже те времена.
везде и всегда!
честная математика для 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
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Поворот одной точки по трем осям (оптимизация возможна):
И расчет таблицы:Код:;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
Pentagon1024sl2.2/TSFM/Z-Controller/GS128Kb/HDD/CDROM/Palcoder
смешные вы.. тут думаешь, что 256 итераций поворота то мало для красивых эффектов, а вы это чистло до 64 сокращаете..
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)