主题:[救救我] 3D高手必看
PHI
[专家分:10] 发布于 2005-08-18 22:33:00
谁能用PASCAL驱动3D引擎,Dircet X,OpenGL 都可以!
不幸的话仿真画图都可以呀!
回复列表 (共11个回复)
沙发
FancyMouse [专家分:13680] 发布于 2005-08-18 20:15:00
貌似delphi可以调用dx的
板凳
PHI [专家分:10] 发布于 2005-08-18 20:29:00
[ 关于空间绘图的几个猜想 ]
(如果懂Dircet X,OpenGL的可以随便发表意见,本人洗耳恭听)
(1)曲面的表达
无论何种曲面(NURBS,Patch面片......)在最终表现的时候,都是一个[b]三角形[/b]的序列。刚开始的时候,我打算序列的每一个三角形都写成三个顶点的坐标,但后来发现不好。
我把顶点[b]单独列成序列[/b] ,三角形序列只纪录[b]三个顶点的序列号[/b] 。这样,也许无论表现还是编辑都简单一点吧。
(2)参数曲面
任何一个参数曲面都可以写成以下形式
/ x=f1(u,v)
S={ y=f2(u,v) (u,v是两个参数)
\ z=f3(u,v)
于是,我打算用一个二维数组记录顶点坐标,三角形用“块状配对”的方法来完成,再表现出来。
至于“块状配对”,是指
u u+1
| |
V V
| |
v -> --+----------+--------
| 1 \ 2 |
v+1 -> --+----------+--------
| |
每一个小方格里被分出两个三角形。
3 楼
stuart920106 [专家分:730] 发布于 2005-08-18 21:16:00
Program BMP_256c_demo;
uses dos ;
Type
VESA_MODE_INFO = record
Mode_Attri : word;
Win_A_Attri: byte;
Win_B_Attri: byte;
Win_Gran : word;
Win_size : word;
Win_A_Seg : word;
Win_B_Seg : word;
Win_Func_Ptr: Longint;
Bytes_Ptr_Scanline: word;
X_Res : word;
Y_Res : word;
X_Char_Size: word;
Y_Char_Size: word;
Num_Of_Planes : byte;
Bits_Per_Pixel : byte;
Num_Of_Banks : byte;
Mem_Model : byte;
Bank_Size : word;
end;
var
rf : file;
flname: string;
inf : VESA_MODE_INFO;
Procedure set_VESA_mode(volue:integer);
var
regs : Registers;
begin
with regs do
begin
ah := $4f;
al := $02;
bx := volue;
end;
intr($10,regs);
end;
4 楼
stuart920106 [专家分:730] 发布于 2005-08-18 21:16:00
Procedure set_BMP_SVGA_Palette;
Var
rgb : array[0..1023] of byte;
pal : array[0..767] of byte;
recread : word;
LP : integer;
regs: Registers;
begin
assign(rf,flname);
reset(rf,1);
seek(rf,54);
blockread(rf,rgb,1024,recread);
close(rf);
for LP := 0 to 255 do
begin
pal[LP*3] := rgb[LP*4+2] shr 2;
pal[LP*3+1] := rgb[LP*4+1] shr 2 ;
pal[LP*3+2] := rgb[LP*4] shr 2;
end;
with regs do
begin
es := SEG(pal);
dx := OFS(pal);
ax := $1012;
bx := 0;
cx := 256;
end;
intr($10,regs);
end;
procedure select_VESA_page(RW_page:byte; Gran:integer);
var
regs : Registers;
begin
with regs do
begin
dx := 64 div Gran*RW_page;
ax := $4f05;
bx := 0;
end;
intr($10,regs);
end;
procedure get_VESA_INFO(volue:integer);
var
regs : Registers;
begin
with regs do
begin
di := OFS(inf);
es := SEG(inf);
ax := $4f01;
cx := volue;
end;
intr($10,regs);
end;
5 楼
stuart920106 [专家分:730] 发布于 2005-08-18 21:17:00
procedure VESA_pix(x,y:longint;color:byte);
var
i,t1,t2 : word;
q : ^byte;
c : byte;
begin
q := ptr($a000,$0000);
i := (y*640+x) mod 65536;
inc(q,i);
q^ := color;
end;
function pow(x,i:longint):longint;
var
k : longint;
temp : longint;
begin
temp := 1;
for k := 1 to i do temp := temp*x;
pow := temp;
end;
procedure putbmp(x,y:integer; c:integer);
const
x_line : array[0..5] of integer = (0,255,511,127,383,0);
y_line : array[0..5] of integer = (0,102,204,307,409,480);
var
i,j : longint;
yy,xx : longint;
RW_page:integer;
BMP_size,BMP_width,BMP_length,BMP_wid : longint;
buff : array[0..1024] of byte;
recread: word;
begin
RW_page := 0; BMP_size := 0;
assign(rf,flname);
reset(rf,1);
seek(rf,2);
blockread(rf,buff,4,recread);
buff[4] := 0;
i := 0;
while buff[i]<>0 do
begin
BMP_size := BMP_size+pow(256,i)*buff[i];
i := i+1;
end;
seek(rf,$12);
blockread(rf,buff,4,recread);
yy := buff[1];
bmp_width := yy*256+buff[0];
blockread(rf,buff,4,recread);
yy := buff[1];
BMP_length := yy*256+buff[0];
BMP_wid := (BMP_size-1078) div BMP_length;
for i := 0 to BMP_length-1 do
begin
seek(rf,BMP_size-(i+1)*BMP_wid);
blockread(rf,buff,BMP_wid,recread);
yy := i+y;
for j := 0 to BMP_width-1 do
begin
xx := x+j;
if(yy>=y_line[RW_page])and(yy<y_line[RW_page+1])
then
else
if(yy=y_line[RW_page+1]) and (xx < x_line[RW_page+1])
then
else
begin
RW_page := (yy*640+xx) div 65536;
select_VESA_page(RW_page,c);
end;
VESA_pix(xx,yy,buff[j]);
end;
end;
close(rf);
end;
7 楼
stuart920106 [专家分:730] 发布于 2005-08-18 21:18:00
procedure read_key;
var
regs : Registers;
begin
with regs do
begin
ah := 7;
al := 0;
end;
intr($21,regs);
end;
procedure set_vga_mode;
var
regs : Registers;
begin
with regs do
begin
ah := 0;
al := 2;
end;
intr($10,regs);
end;
BEGIN
write('Enter a 256 colors BMP file name: ');
readln(flname);
set_VESA_mode($101);
get_VESA_info($101);
set_BMP_SVGA_Palette;
putbmp(0,0,inf.WIN_Gran);
read_key;
set_vga_mode;
END.
这是调用256色图片程序(多少有点关系吧)
8 楼
PHI [专家分:10] 发布于 2005-08-18 21:23:00
我要一个procedure,输入是两个三角形A,B,绘图:三角形A没有被三角形B挡住的部分。
A,B是任意给定的空间三角形,利用这个方法也许可以画曲面了呢!
9 楼
口口and枕头 [专家分:1550] 发布于 2005-08-18 21:59:00
天书~
10 楼
PHI [专家分:10] 发布于 2005-08-20 16:36:00
介绍一个方法:抠像法
[基本思路]
用一个二重循环,第一个循环变量表示要表现的三角形,第二个是要“抠掉的”三角形。
先把第一个三角形的图像先[b]存在数组里[/b] ,在一个一个抠掉被挡住的部分,最后画图,大功告成!
[b]现征集源代码,每一个贴子都加分,多发多加,发得多加得多![/b]
我来回复