其实原理也简单,就是使用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.