ENDP UpdateAngles
PROC GetSinCos ; Needed : bx=angle (0..255) ; Returns: ax=Sin bx=Cos push bx ; Save angle (use as pointer) shl bx,1 ; Grab a word so bx=bx*2 mov ax,[SinCos bx] ; Get sine 逆风编程技术 pop bx ; Restore pointer into bx push ax ; Save sine on stack add bx,64 ; Add 64 to get cosine and bx,11111111b ; Range from 0..255 shl bx,1 ; *2 coz it's a word mov ax,[SinCos bx] ; Get cosine mov bx,ax ; Save it bx=Cos pop ax ; Restore ax=Sin ret ENDP GetSinCos
PROC SetRotation ; Set sine & cosine of x,y,z mov bx,[XAngle] ; Grab angle call GetSinCos ; Get the sine&cosine mov [Xsin],ax ; Save sin mov [Xcos],bx ; Save cos
mov bx,[Yangle] call GetSinCos mov [Ysin],ax mov [Ycos],bx
mov bx,[Zangle] call GetSinCos mov [Zsin],ax mov [Zcos],bx ret ENDP SetRotation
PROC RotatePoint ; Rotates the point around x,y,z ; Gets original x,y,z values ; This can be done elsewhere movsx ax,[Cube si] ; si = X (movsx coz of byte) mov [X],ax movsx ax,[Cube si 1] ; si 1 = Y mov [Y],ax movsx ax,[Cube si 2] ; si 2 = Z mov [Z],ax
; Rotate around x-axis ; YT = Y * COS(xang) - Z * SIN(xang) / 256 ; ZT = Y * SIN(xang) Z * COS(xang) / 256 ; Y = YT ; Z = ZT
mov ax,[Y] mov bx,[XCos] imul bx ; ax = Y * Cos(xang) mov bp,ax mov ax,[Z] mov bx,[XSin] imul bx ; ax = Z * Sin(xang) sub bp,ax ; bp = Y * Cos(xang) - Z * Sin(xang) sar bp,8 ; bp = Y * Cos(xang) - Z * Sin(xang) / 256 mov [Yt],bp
mov ax,[Y] mov bx,[XSin] imul bx ; ax = Y * Sin(xang) mov bp,ax mov ax,[Z] mov bx,[XCos] imul bx ; ax = Z * Cos(xang) add bp,ax ; bp = Y * SIN(xang) Z * COS(xang) sar bp,8 ; bp = Y * SIN(xang) Z * COS(xang) / 256 mov [Zt],bp
mov ax,[Yt] ; Switch values mov [Y],ax mov ax,[Zt] mov [Z],ax
; Rotate around y-axis ; XT = X * COS(yang) - Z * SIN(yang) / 256 ; ZT = X * SIN(yang) Z * COS(yang) / 256 ; X = XT ; Z = ZT
mov ax,[X] mov bx,[YCos] imul bx ; ax = X * Cos(yang) mov bp,ax mov ax,[Z] mov bx,[YSin] imul bx ; ax = Z * Sin(yang) sub bp,ax ; bp = X * Cos(yang) - Z * Sin(yang) sar bp,8 ; bp = X * Cos(yang) - Z * Sin(yang) / 256 mov [Xt],bp
mov ax,[X] mov bx,[YSin] imul bx ; ax = X * Sin(yang) mov bp,ax mov ax,[Z] mov bx,[YCos] imul bx ; ax = Z * Cos(yang) add bp,ax ; bp = X * SIN(yang) Z * COS(yang) sar bp,8 ; bp = X * SIN(yang) Z * COS(yang) / 256 mov [Zt],bp
mov ax,[Xt] ; Switch values mov [X],ax mov ax,[Zt] mov [Z],ax
; Rotate around z-axis ; XT = X * COS(zang) - Y * SIN(zang) / 256 ; YT = X * SIN(zang) Y * COS(zang) / 256 ; X = XT ; Y = YT
mov ax,[X] mov bx,[ZCos] imul bx ; ax = X * Cos(zang) mov bp,ax mov ax,[Y] mov bx,[ZSin] imul bx ; ax = Y * Sin(zang) sub bp,ax ; bp = X * Cos(zang) - Y * Sin(zang) sar bp,8 ; bp = X * Cos(zang) - Y * Sin(zang) / 256 mov [Xt],bp
mov ax,[X] mov bx,[ZSin] imul bx ; ax = X * Sin(zang) mov bp,ax mov ax,[Y] mov bx,[ZCos] imul bx ; ax = Y * Cos(zang) add bp,ax ; bp = X * SIN(zang) Y * COS(zang) sar bp,8 ; bp = X * SIN(zang) Y * COS(zang) / 256 mov [Yt],bp
mov ax,[Xt] ; Switch values mov [X],ax mov ax,[Yt] mov [Y],ax
ret ENDP RotatePoint PROC ShowPoint ; Calculates screenposition and ; plots the point on the screen
本文章更多内容:<<上一页 - 1 - 2 - 3 - 4 - 下一页>> |