其实原理也简单,就是使用TD3DMATRIX而已。但主要是要注意先把图像中点弄到中心原点(因为ASPHYRE在2D时,顶点声明为D3D_XYZRHW的,告诉设备此是已经做过变换的,所以只有我们手动做这个工作了。)
代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AsphyreSubsc, AsphyreDevices, Asphyre2D, AsphyreCanvas,DXBase,
AsphyreTimers, AsphyreImages , AsphyreDef, AsphyreDb,D3DX9,Direct3D9;
const
VR_PI : Single= 3.141592654;
type
TForm1 = class(TForm)
Device: TAsphyreDevice;
Timer: TAsphyreTimer;
MyCanvas: TAsphyreCanvas;
Images: TAsphyreImages;
ASDB: TASDb;
procedure FormShow(Sender: TObject);
procedure DeviceInitialize(Sender: TObject; var Success: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TimerTimer(Sender: TObject);
procedure DeviceRender(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
i : integer;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
Device.Initialize;
end;
procedure TForm1.DeviceInitialize(Sender: TObject; var Success: Boolean);
begin
if Success = false then close;
Images.LoadFromASDb(ASDB);
Timer.Enabled := true;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Device.Finalize;
end;
procedure TForm1.TimerTimer(Sender: TObject);
begin
Device.Render(255,true);
Device.Flip;
end;
procedure TForm1.DeviceRender(Sender: TObject);
var
Matrix,M1,M2 : TD3DMatrix;
Vec1,vec2 : TD3DXVector3;
Dest1,dest2 : TD3DXVector3;
Angle : single;
begin
inc(i);
if i = 360 then i := 0;
Angle := VR_PI/180*i;
D3DX9.D3DXMatrixRotationX(M1,Angle);
D3DX9.D3DXMatrixTranslation(M2,100,300,0.0);
D3DX9.D3DXMatrixMultiply(Matrix,m1,m2);
Vec1 := D3DXVector3( 0,-Images[0].VisibleSize.Y/2,1.0);
Vec2 := D3DXVector3( Images[0].VisibleSize.X,Images[0].VisibleSize.Y/2, 1.0 );
D3DX9.D3DXVec3TransformCoord(dest1,vec1,Matrix);
D3DX9.D3DXVec3TransformCoord(dest2,vec2,Matrix);
MyCanvas.Draw(Images[0],Rect(Round(dest1.x),Round(dest1.y),Round(dest2.x),Round(dest2.y)),0,fxnone);
end;
end.