Rapid-Q by William Yu (c)1999-2000 .

Upload il tuo script su Rapidq.it

Capitolo 13: Direct3D per Rapid-Q

13. Direct3D per Rapid-Q

Questa è solo un'introduzione all'utilizzo di Direct3D con Rapid-Q. Siccome gran parte dei componenti Direct3d non sono stati ancora completati in Rapid-Q, questo capitolo tratterà soprattutto ciò che è possibile fare.

13.1 Requisiti
Il requisito fondamentale è di avere installato DirectX 6.0. Se non siete sicuri della versione che avete, digitate DXDIAG al prompt dei comandi, o trovate il file in C:\WINDOWS\SYSTEM. Se non avete DXDIAG è senz'altro il caso di aggiornarsi. Potete scaricare i file a questo indirizzo http://msdn.microsoft.com/directx/
Bastano i file di runtime, non l'SDK, ma se lo volete niente vi impedisce di scaricarlo. L'SDK contiene un file importante, CONV3DS.EXE, necessario per convertire diversi modelli 3D da utilizzare nei vostri programmi. Tuttavia, ho pubblicato un link per evitare di scaricare l'intero SDK solo per quel file.

    Altre cose che è utile avere:
  • Scheda audio 3D accelerata
  • Modellatore 3D (come 3D Studio)
  • OpenGL (alcuni modellatori 3D lo usano)
Anche se non avete niente di tutto questo, non importa. Una scheda 3D non è necessaria, ma troverete che i vostri programmi gireranno 5-10 volte più lentamente, ma accettabilmente se avete un buon Pentium. Io non ho una scheda 3D, ed arrivo a circa 5-10 fps col mio P200, ma non mi preoccupa. Se non avete un modellatore 3D non preoccupatevi, ce ne sono di gratuiti in Internet.Secondo me Anim8or è piuttosto buono, per essere completamente gratuito non c'è di che lamentarsi. E' un download da soli 500Kb, che è molto buono rispetto ad altri programmi simili. Non richiede OpenGL, ma controllate se la directory C:\WINDOWS\SYSTEM contiene OPENGL32.DLL. Se l'avete siete a posto, altrimenti scaricatela da http://www.opengl.org/

13.2 Utilizzo di Anim8or per la creazione di modelli 3D
Se avete già una buona conoscenza della creazione di modelli 3D, potete saltare questa sezione. Userò Anim8or per dimostrare la creazione di semplici modelli 3D che potrete usare rapidamente nei programmi Rapid-Q. Se non avete ancora scaricato la documentazione HTML di Anim8or, vi suggerisco di farlo. Non spiegherò tutto di Anim8or, solo le cose basilari.

    Introduzione passo-passo
  • Lanciare Anim8or
  • Cliccare su un poligono
     
  • Per disegnare l'oggetto, cliccare e trtascinarlo nel riquadro principale 
  • Assicuratevi di centrare l'oggetto (non è necessario, ma è preferibile). Per fare ciò, selezionate l'oggetto che volete centrare, e sciegliete dal menu: Edit|Locate|Center about origin
  • Non esagerate con le dimensioni del poligono.
  • Ora, per esportare il vostro oggetto selezionate dal menu: Object|Export Salvare come file .3DS.
  • Supponiamo che abbiate chiamato il vostro file poly.3ds: dal prompt dei comandi digitate:
       CONV3DS -m poly.3ds
    Ho dato per assodato cha abbiate scaricato CONV3DS.EXE.
  • Una volta convertito, dovreste avere un file poly.x, che può essere utilizzato nei programmi Rapid-Q!
Se preferite non fare voi stessi i modelli 3D potete sempre scaricarne di già pronti da www.3dcafe.com ed altri siti simili. Tuttavia, è sempre bello personalizzare i propri oggetti, perciò è consigliabile imparare ad usare un modellatore 3D. Il parametro opzionale -m è utilizzato per creare un mesh da utilizzare con MeshBuilder. Senza -m, il vostro file è salvato come frame, e dovreste usare QD3DFrame per caricarlo.

13.3 Carico/Scarico di files .X
Il carico di un file .X è piuttosto semplice, per essere sicuri che fin qui sia tutto a posto, copiate questo codice:
' Mette semplicemente un'oggetto sulla scena

$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

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 = 'Esempio Direct 3D'
    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

   DXScreen.CreateFrame(LightFrame)
   DXScreen.CreateFrame(MeshFrame)

   '-- Serve della luce, altrimenti l'oggetto non sarà visibile
   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)  '-- Crea l'oggetto

   MeshBuilder.Load('poly.x')               '-- Carica l'oggetto
   MeshFrame.AddVisual(MeshBuilder)         '-- Aggiungi l'oggetto alla cornice
END SUB

SUB DXTimerExpired
   DXScreen.ForceUpdate(0,0,50,50)   '-- Aggiorna il testo FPS
   DXScreen.Render
   DXScreen.TextOut(10,10,'FPS: '+STR$(DXTimer.FrameRate), &HFFFFFF, -1)
   DXScreen.Flip
END SUB
Se tutto è andato bene, dovreste ottenere un risultato simile a questo:



Se avete capito l'esempio, è abbastanza facile aggiungere oggetti, basta creare un altro MeshFrame e caricare un altro file oggetto. Provate finchè vi sembrerà soddisfacente.

13.4 Inserire un motivo attorno ad un oggetto
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).




2003 Holyguard.net - 2007 Abruzzoweb