首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

組合語言 3D 圖形經典:旋轉星空盒子動畫原始碼賞析

     編輯:組合語言

前言

這是一個 1995 年由國外組合語言高手 Vulture 編寫的 3D 動畫小程式,僅用星號(像素點)構成立方體並在三軸持續旋轉。程式採用 TASM 理想模式,直接操作 VGA 記憶體(0xA000:0000),利用查表法計算正弦/餘弦,定點數學實現 3D 旋轉變換,配合垂直回描同步消除閃爍。這不僅是技術展示,更是早期 Demoscene 文化的縮影。

核心數學原理

程式實現標準 3D 旋轉矩陣,但為了速度採用定點運算:將正弦/餘弦值乘以 256 存為整數,運算後再右移 8 位(除以 256)。三軸旋轉公式如下:

  • 繞 X 軸:Y' = Y·cosθ - Z·sinθ / 256;Z' = Y·sinθ + Z·cosθ / 256
  • 繞 Y 軸:X' = X·cosθ - Z·sinθ / 256;Z' = X·sinθ + Z·cosθ / 256
  • 繞 Z 軸:X' = X·cosθ - Y·sinθ / 256;Y' = X·sinθ + Y·cosθ / 256

每幀更新三軸角度(DeltaX/Y/Z 控制速度),重新計算所有 125 個頂點(5×5×5 立方晶格)位置,投影至螢幕(透視除法:Xoff·X/(Z+Zoff)),繪製像素點,隨後等待垂直回描清除舊幀——經典的「雙緩衝」無閃爍動畫技巧。

關鍵技術亮點

1. 查表法加速三角函數

Label SinCos Word ; 256 個正弦值(已乘 256)
dw 0,6,13,19,25,31,38,44,50,56
dw 62,68,74,80,86,92,98,104,109,115
...
GetSinCos PROC
 push bx
 shl bx,1
 mov ax,[SinCos + bx] ; 取正弦
 pop bx
 push ax
 add bx,64 ; 相位差 90 度取餘弦
 and bx,11111111b
 shl bx,1
 mov ax,[SinCos + bx]
 mov bx,ax
 pop ax
 ret
ENDP

2. VGA 記憶體直接寫入與分頁控制

使用 INT 10h AX=13h 進入 320×200×256 色模式(Mode 13h),ES 指向 0xA0000。ShowPoint 計算螢幕座標 (y*320)+x,直接寫入顯存;WaitVrt 等待垂直回描(端口 0x3DA)同步幀率。

3. 立方體資料結構與動態生成

Label Cube Byte ; 125 個 3D 點 (X,Y,Z 各佔 1 byte)
c = -35
rept 5
 b = -35
 rept 5
 a = -35
 rept 5
 db a,b,c
 a = a + 20
 endm
 b = b + 20
 endm
 c = c + 20
 endm

完整原始碼(TASM 理想模式)

IDEAL
P386
JUMPS
SEGMENT CODE
ASSUME cs:code,ds:code
ORG 100h
START:
 mov ax,0013h
 int 10h
 mov ax,cs
 mov ds,ax
 mov ax,0a000h
 mov es,ax
 lea si,[Palette]
 mov dx,3c8h
 xor al,al
 out dx,al
 mov dx,3c9h
 mov cx,189*3
 repz outsb
 mov [DeltaX],1
 mov [DeltaY],1
 mov [DeltaZ],1
 mov [Xoff],256
 mov [Yoff],256
 mov [Zoff],300
MainLoop:
 call MainProgram
 in al,60h
 cmp al,1
 jne MainLoop
 mov ax,0003h
 int 10h
 lea dx,[Credits]
 mov ah,9
 int 21h
 mov ax,4c00h
 int 21h
...
PROC RotatePoint
 movsx ax,[Cube+si]
 mov [X],ax
 movsx ax,[Cube+si+1]
 mov [Y],ax
 movsx ax,[Cube+si+2]
 mov [Z],ax
 ; 繞 X 軸旋轉
 mov ax,[Y]
 mov bx,[XCos]
 imul bx
 mov bp,ax
 mov ax,[Z]
 mov bx,[XSin]
 imul bx
 sub bp,ax
 sar bp,8
 mov [Yt],bp
 ...
 ret
ENDP
...
ENDS CODE
END START

編譯與執行

  1. tasm 3d.asm
  2. tlink 3d.obj
  3. exe2bin 3d.exe 3d.com
  4. 在 DOS 或 DOSBox 中執行 3d.com

總結

這個不足 1KB 的 .COM 程式,用最樸素的指令構建出迷人的 3D 視覺效果,展示了組合語言程式設計師對硬體極限的掌控與對數學之美的追求。它是學習 3D 圖形基礎、定點運算、VGA 程式設計、Demoscene 歷史的絕佳教材。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved