我最近开始学习DirectX的编程,因为DirectX 8要好用了很多,所以才打算学习的,我遇到一个问题,我怎么也旋转不了画的一个三角形面,我完全按照SDK的例子写的,奇怪的很,源程序如下,需要DirectX8 Pascal翻译文件的可以找我要。unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DirectXGraphics,DXCommon, ActiveX, ComObj, StdCtrls, D3DX8,
MMSystem;type TCUSTOMVERTEX = record
X,Y,Z,RHW:Single;
Color:DWORD;
end; TForm2 = class(TForm)
Timer1: TTimer;
Button1: TButton;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ID3d:IDirect3D8;
ID3DD:IDirect3DDevice8;
IBuf:IDirect3DVertexBuffer8;
end;var
Form2: TForm2;const
D3DFVF_CUSTOMVERTEX=D3DFVF_XYZRHW or D3DFVF_DIFFUSE;implementation{$R *.dfm}procedure TForm2.FormPaint(Sender: TObject);
var
matWorld:TD3DXMATRIX;
matView:TD3DXMatrix;
D1,D2,D3:TD3DXVECTOR3;
matProj:TD3DXMATRIX;
begin
OLECheck(ID3DD.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0));
OLECheck(ID3DD.BeginScene);
D3DXMatrixRotationY(matWorld,timeGetTime/150.0);
OLECheck(ID3DD.SetTransform(D3DTS_WORLD,matWorld));
D1:=D3DXVECTOR3(0.0,3.0,-5.0);
D2:=D3DXVECTOR3(0.0,0.0,0.0);
D3:=D3DXVECTOR3(0.0,1.0,0.0);
D3DXMatrixLookAtLH(matView,D1,D2,D3);
OLECheck(ID3DD.SetTransform(D3DTS_VIEW,matView));
D3DXMatrixPerspectiveFovLH(matProj,D3DX_PI/4,1.0,1.0,100.0);
OLECheck(ID3DD.SetTransform(D3DTS_PROJECTION,matProj));
OLECheck(ID3DD.SetStreamSource(0,IBuf,SizeOf(TCUSTOMVERTEX)));
OLECheck(ID3DD.SetVertexShader(D3DFVF_CUSTOMVERTEX));
OLECheck(ID3DD.DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1));
OLECheck(ID3DD.EndScene);
OLECheck(ID3DD.Present(nil,nil,0,nil));
end;procedure TForm2.FormCreate(Sender: TObject);
var
D3DDM:TD3DDISPLAYMODE;
D3DPP:TD3DPRESENT_PARAMETERS;
Points:array of TCUSTOMVERTEX;
Buf:PByte;
begin
SetLength(Points,3);
Points[0].X:=150.0;
Points[0].Y:=50.0;
Points[0].Z:=0.5;
Points[0].RHW:=1.0;
Points[0].Color:=$ffff0000;
Points[1].X:=250.0;
Points[1].Y:=250.0;
Points[1].Z:=0.5;
Points[1].RHW:=1.0;
Points[1].Color:=$ff00ff00;
Points[2].X:=50.0;
Points[2].Y:=250.0;
Points[2].Z:=0.5;
Points[2].RHW:=1.0;
Points[2].Color:=$ff00ffff;
ID3d:=Direct3DCreate8(D3D_SDK_VERSION);
OLECheck(ID3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT,D3DDM));
FillChar(D3DPP,SizeOf(D3DPP),0);
D3DPP.Windowed:=True;
D3DPP.SwapEffect:=D3DSWAPEFFECT_DISCARD;
D3DPP.BackBufferFormat:=D3DDM.Format;
OLECheck(ID3d.CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Form2.Handle,D3DCREATE_SOFTWARE_VERTEXPROCESSING,D3DPP,ID3DD));
OLECheck(ID3DD.CreateVertexBuffer(3*SizeOf(TCUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,IBuf));
OLECheck(IBuf.Lock(0,3*SizeOf(TCUSTOMVERTEX),Buf,0));
Move(Points[0],Buf^,3*SizeOf(TCUSTOMVERTEX));
OLECheck(IBuf.Unlock);
Finalize(Points);
end;procedure TForm2.FormDestroy(Sender: TObject);
begin
IBuf:=nil;
ID3DD:=nil;
ID3D:=nil;
end;procedure TForm2.Timer1Timer(Sender: TObject);
var
matWorld:TD3DXMATRIX;
matView:TD3DXMatrix;
D1,D2,D3:TD3DXVECTOR3;
matProj:TD3DXMATRIX;
begin
OLECheck(ID3DD.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0));
OLECheck(ID3DD.BeginScene);
D3DXMatrixRotationY(matWorld,timeGetTime/150);
OLECheck(ID3DD.SetTransform(D3DTS_WORLD,matWorld));
D1:=D3DXVECTOR3(0.0,3.0,-5.0);
D2:=D3DXVECTOR3(0.0,0.0,0.0);
D3:=D3DXVECTOR3(0.0,1.0,0.0);
D3DXMatrixLookAtLH(matView,D1,D2,D3);
OLECheck(ID3DD.SetTransform(D3DTS_VIEW,matView));
D3DXMatrixPerspectiveFovLH(matProj,D3DX_PI/4,1.0,1.0,100.0);
OLECheck(ID3DD.SetTransform(D3DTS_PROJECTION,matProj));
OLECheck(ID3DD.SetStreamSource(0,IBuf,SizeOf(TCUSTOMVERTEX)));
OLECheck(ID3DD.SetVertexShader(D3DFVF_CUSTOMVERTEX));
OLECheck(ID3DD.DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1));
OLECheck(ID3DD.EndScene);
OLECheck(ID3DD.Present(nil,nil,0,nil));
end;procedure TForm2.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=not Timer1.Enabled;
end;end.帮忙看看我什么地方理解错了。谢谢,200分奉上,不够还可以加,我有8000可用分。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DirectXGraphics,DXCommon, ActiveX, ComObj, StdCtrls, D3DX8,
MMSystem;type TCUSTOMVERTEX = record
X,Y,Z,RHW:Single;
Color:DWORD;
end; TForm2 = class(TForm)
Timer1: TTimer;
Button1: TButton;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ID3d:IDirect3D8;
ID3DD:IDirect3DDevice8;
IBuf:IDirect3DVertexBuffer8;
end;var
Form2: TForm2;const
D3DFVF_CUSTOMVERTEX=D3DFVF_XYZRHW or D3DFVF_DIFFUSE;implementation{$R *.dfm}procedure TForm2.FormPaint(Sender: TObject);
var
matWorld:TD3DXMATRIX;
matView:TD3DXMatrix;
D1,D2,D3:TD3DXVECTOR3;
matProj:TD3DXMATRIX;
begin
OLECheck(ID3DD.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0));
OLECheck(ID3DD.BeginScene);
D3DXMatrixRotationY(matWorld,timeGetTime/150.0);
OLECheck(ID3DD.SetTransform(D3DTS_WORLD,matWorld));
D1:=D3DXVECTOR3(0.0,3.0,-5.0);
D2:=D3DXVECTOR3(0.0,0.0,0.0);
D3:=D3DXVECTOR3(0.0,1.0,0.0);
D3DXMatrixLookAtLH(matView,D1,D2,D3);
OLECheck(ID3DD.SetTransform(D3DTS_VIEW,matView));
D3DXMatrixPerspectiveFovLH(matProj,D3DX_PI/4,1.0,1.0,100.0);
OLECheck(ID3DD.SetTransform(D3DTS_PROJECTION,matProj));
OLECheck(ID3DD.SetStreamSource(0,IBuf,SizeOf(TCUSTOMVERTEX)));
OLECheck(ID3DD.SetVertexShader(D3DFVF_CUSTOMVERTEX));
OLECheck(ID3DD.DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1));
OLECheck(ID3DD.EndScene);
OLECheck(ID3DD.Present(nil,nil,0,nil));
end;procedure TForm2.FormCreate(Sender: TObject);
var
D3DDM:TD3DDISPLAYMODE;
D3DPP:TD3DPRESENT_PARAMETERS;
Points:array of TCUSTOMVERTEX;
Buf:PByte;
begin
SetLength(Points,3);
Points[0].X:=150.0;
Points[0].Y:=50.0;
Points[0].Z:=0.5;
Points[0].RHW:=1.0;
Points[0].Color:=$ffff0000;
Points[1].X:=250.0;
Points[1].Y:=250.0;
Points[1].Z:=0.5;
Points[1].RHW:=1.0;
Points[1].Color:=$ff00ff00;
Points[2].X:=50.0;
Points[2].Y:=250.0;
Points[2].Z:=0.5;
Points[2].RHW:=1.0;
Points[2].Color:=$ff00ffff;
ID3d:=Direct3DCreate8(D3D_SDK_VERSION);
OLECheck(ID3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT,D3DDM));
FillChar(D3DPP,SizeOf(D3DPP),0);
D3DPP.Windowed:=True;
D3DPP.SwapEffect:=D3DSWAPEFFECT_DISCARD;
D3DPP.BackBufferFormat:=D3DDM.Format;
OLECheck(ID3d.CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Form2.Handle,D3DCREATE_SOFTWARE_VERTEXPROCESSING,D3DPP,ID3DD));
OLECheck(ID3DD.CreateVertexBuffer(3*SizeOf(TCUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,IBuf));
OLECheck(IBuf.Lock(0,3*SizeOf(TCUSTOMVERTEX),Buf,0));
Move(Points[0],Buf^,3*SizeOf(TCUSTOMVERTEX));
OLECheck(IBuf.Unlock);
Finalize(Points);
end;procedure TForm2.FormDestroy(Sender: TObject);
begin
IBuf:=nil;
ID3DD:=nil;
ID3D:=nil;
end;procedure TForm2.Timer1Timer(Sender: TObject);
var
matWorld:TD3DXMATRIX;
matView:TD3DXMatrix;
D1,D2,D3:TD3DXVECTOR3;
matProj:TD3DXMATRIX;
begin
OLECheck(ID3DD.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0));
OLECheck(ID3DD.BeginScene);
D3DXMatrixRotationY(matWorld,timeGetTime/150);
OLECheck(ID3DD.SetTransform(D3DTS_WORLD,matWorld));
D1:=D3DXVECTOR3(0.0,3.0,-5.0);
D2:=D3DXVECTOR3(0.0,0.0,0.0);
D3:=D3DXVECTOR3(0.0,1.0,0.0);
D3DXMatrixLookAtLH(matView,D1,D2,D3);
OLECheck(ID3DD.SetTransform(D3DTS_VIEW,matView));
D3DXMatrixPerspectiveFovLH(matProj,D3DX_PI/4,1.0,1.0,100.0);
OLECheck(ID3DD.SetTransform(D3DTS_PROJECTION,matProj));
OLECheck(ID3DD.SetStreamSource(0,IBuf,SizeOf(TCUSTOMVERTEX)));
OLECheck(ID3DD.SetVertexShader(D3DFVF_CUSTOMVERTEX));
OLECheck(ID3DD.DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1));
OLECheck(ID3DD.EndScene);
OLECheck(ID3DD.Present(nil,nil,0,nil));
end;procedure TForm2.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=not Timer1.Enabled;
end;end.帮忙看看我什么地方理解错了。谢谢,200分奉上,不够还可以加,我有8000可用分。
没人答我帮你顶。
学DirectX 是我的梦想,不过太复杂了,还是先学点封装好的东西吧!
祝你学DirectX 顺利,多多回贴