Ora che abbiamo le basi, proviamo ad inserire un motivo attorno al nostro oggetto. Abbiamo solo bisogno di un file .BMP per il nostro motivo. Ci sono alcune cose da notare. Primo, larghezza ed altezza della bitmap devono essere uguali, secondo, devono essere potenze di 2 (es. 32x32, 256x256, ecc.). Questo è ovviamente per motivi di ottimizzazione, ma non chiedetemi di più, non ho creato io Direct3D. Comunque, per inserire il motivo attorno al nostro oggetto, dobbiamo modificare un pò il codice visto sopra (i cambiamenti sono evidenziati in Blu): ' Inserire motivi attorno ad oggetti 3D
$TYPECHECK ON
CONST alClient = 5
'-- Tipi di luce
CONST D3DRMLIGHT_AMBIENT = 0
CONST D3DRMLIGHT_POINT = 1
CONST D3DRMLIGHT_SPOT = 2
CONST D3DRMLIGHT_DIRECTIONAL = 3
CONST D3DRMLIGHT_PARALLELPOINT = 4
'-- Tipo di motivo
CONST D3DRMWRAP_FLAT = 0
CONST D3DRMWRAP_CYLINDER = 1
CONST D3DRMWRAP_SPHERE = 2
CONST D3DRMWRAP_CHROME = 3
CONST D3DRMWRAP_SHEET = 4
CONST D3DRMWRAP_BOX = 5
CONST WrapType = D3DRMWRAP_SPHERE '-- Potete modificarlo
DECLARE SUB DXInitialize(Sender AS QDXScreen)
DECLARE SUB DXTimerExpired
DIM DXTimer AS QDXTimer
DXTimer.Enabled = 1
DXTimer.Interval = 0
DXTimer.Activeonly = 0
DXTimer.OnTimer = DXTimerExpired
CREATE Form AS QForm
Caption = 'Direct 3D Example'
Center
CREATE DXScreen AS QDXScreen
Init(320,240)
Align = alClient
Use3D = 1
UseHardware = 0 '' Questo è per schede video senza accelerazione 3D. '' 3D sarà emulato usando il software,
'' che è molto più lento.
OnInitialize = DXInitialize
END CREATE
ShowModal
END CREATE
SUB DXInitialize(Sender AS QDXScreen)
DIM Light AS QD3DLight
DIM LightFrame AS QD3DFrame, MeshFrame AS QD3DFrame
DIM MeshBuilder AS QD3DMeshBuilder
DIM Texture AS QD3DTexture
DIM Wrap AS QD3DWrap
DIM Mesh AS QD3DMesh
DXScreen.CreateFrame(LightFrame)
DXScreen.CreateFrame(MeshFrame)
DXScreen.CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, 0.9, 0.9, 0.9, Light)
LightFrame.AddLight(Light)
DXScreen.SetCameraPosition(-5, 10, 0)
DXScreen.SetCameraOrientation(0.35, -0.65, 1.0, -0.15, 1.0, 0.5)
MeshFrame.SetPosition(0, 0, 15)
MeshFrame.SetOrientation(0, 0, 1, 0, 1, 0)
MeshFrame.SetRotation(0, 0, 0, 0.05) ' Angolo di rotazione = 0.05
DXScreen.CreateMeshBuilder(MeshBuilder)
MeshBuilder.Load('poly.x') '-- Oggetto uovo
MeshBuilder.LoadTexture('back.bmp') '-- Nuove righe
MeshBuilder.CreateMesh(Mesh)
MeshFrame.AddVisual(Mesh)
DXScreen.CreateWrap(WrapType, 0,0,0, 0,0,1, 0,1,0, 0,0, 1,1, Wrap)
Wrap.Apply(Mesh)
END SUB
SUB DXTimerExpired
DXScreen.ForceUpdate(0,0,50,50)
DXScreen.Render
DXScreen.TextOut(10,10,'FPS: '+STR$(DXTimer.FrameRate), &HFFFFFF, -1)
DXScreen.Flip
END SUB
Ancora, se tutto ha funzionato dovreste ottenere un risultato come questo (ovviamente a seconda del file che avete utilizzato):

Come potete vedere, non è molto complicato. L'unico problema è che facendo questo perderete alcuni fotogrammi al secondo.
13.5 Ruotare/Muovere oggetti
Sfortunatamente al momento non c'è alcun supporto per le animazioni, ma sarà fatto in seguito. Potete fare delle semplici rotazioni e movimenti utilizzando il metodo Move o aggiustando manualmente il punto di vista e la posizione. Utilizzando l'esempio di prima, aggiungete questo codice: DXScreen.ForceUpdate(0,0,50,50)
DXScreen.Move(1) '-- Aggiungete questa riga
DXScreen.Render
Questo sposta il punto di vista di quanto specificato. L'effetto è una rotazione sull'angolo Theta, che va specificato nella riga: MeshFrame.SetRotation(0, 0, 0, 0.05) ' Angolo di rotazione = 0.05
DXScreen.Move anima l'intera scena, per animare una cornice potete utilizzare MeshFrame.Move(1).