Aktualności: C64 Power - online od stycznia 2000 !

Autor Wątek: 3d obroty duze wektory  (Przeczytany 371 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Fenek_

  • Gość
3d obroty duze wektory
« dnia: 05 Sierpnia 2005, 14:47 »
Wogole to jestem ciekawy czy ktos to przeczyta, ba a nawet pomoze:  
 
Sprawa wyglada tak, koduje duuuze wektory w hiresie 320x200 (lub 256x200),  
wypelniane + 16 kolorow/bez sprajtow  
Mam zrobione szybkie obroty na macierzach - 16 lini rastra plus oborty obiektu 8lini  
rastra plus pozostale bzdety -perspektywa i ukrywanie scian.  
 
Do wyliczenia elementow macierzy 3x3 wykorzystuje sinusa o wartosciah w przedziale  
od -64 do 64 (w kodzie U2). Sinus jest 16 bitowy, czyli poprostu sinus przemnozony przez  
64. Elementy macierzy sa juz 8-bitowe. Nextem na bazie tych wartosci wyliczane sa  
wsporzedne 3d x,y,z tez 8bitowe w U2 dla obiektu.  
Potem  perspektywa i obcinanie do 80x50 i teraz nieszczesne przemnozenie  
wszystkiego razy 4 tj. Xx4 i Yx4 co daje 320x200.  
Pomijajac juz bledy w obcinaniu problemem jest koszmarne drganie w zakresie 4-16 pikseli.  
Rzucilem to w kat bo mi sie nie chce juz nad tym siedziec, jedyny sensowny sposob  
jaki widze to przepisac wszystkie operacje na wiecej bitow 32,24,16 ?  
 
Wszystko musi byc tak liczone zeby juz ostatecznie po perspektywie wspolrzedne  
byly 16 bitowe tak zeby obiekt byl wiekszy od ekranu. No wlasnie i moze mi ktos  
przypomni jak sie wykonuje operacje add/sub i inne tego typu na wordach/longach  
lub 24-bitach ?  
 
Jakby ktos mogl pomoc pisac na maila fenekars@wp.pl.  
 
Fenek/Arise



Offline ytm_

  • Level 1
  • *
  • Wiadomości: 46
    • https://github.com/ytmytm
3d obroty duze wektory
« Odpowiedź #1 dnia: 05 Sierpnia 2005, 15:30 »
Dzialania na >:16 bitach to rozszerzenie tego, co znamy z 16 bitami, czyli:
    lda src
    clc
    adc tgt
    lda src+1
    adc tgt+1
    lda src+2
    adc tgt+2
    lda src+3
    adc tgt+3
itd.
Z odejmowaniem/mnozeniem i dzieleniem jest tak samo - tam, gdzie przy 16 bitach zatrzymujesz sie kopiujesz kawalek dla starszego bajtu tyle razy, ile tych starszych bajtow jest.
Np. mnozenie longow z mojego sterownika CIAIDE:
 
LMult       : (long)(r0/r1)*(long)(r2/r3)-->:(long)(r4/r5)
                LDA #0
                STA r4L:STA r4H:STA r5L:STA r5H
 
                LDY #32
LMultLp
                LSR r1H:ROR r1L:ROR r0H:ROR r0L
                BCC LMultNextBit
                CLC
                LDA r4L:ADC r2L:STA r4L
                LDA r4H:ADC r2H:STA r4H
                LDA r5L:ADC r3L:STA r5L
                LDA r5H:ADC r3H:STA r5H
 
LMultNextBit
                ASL r2L:ROL r2H:ROL r3L:ROL r3H
                DEY
                BNE LMultLp
                RTS