' 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 indirizzohttp://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 dahttp://www.opengl.org/ * Collegamenti utili: * Homepage_di_Anim8orbuon modellatore 3D * Homepage_DOGAaltro buon modellatore 3D gratuito * CONV3DS.EXEconverte file .3DS in file .X * 3DCafe.commigliaia di modelli 3D * Homepage_Microsoft_DirectXper maggiori dettagli, scaricate la documentazione SDK 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 [http://www.rapidq.it/public/hell_editor/homepages/images/chap13d1.gif] * Per disegnare l'oggetto, cliccare e trtascinarlo nel riquadro principale [http://www.rapidq.it/public/hell_editor/homepages/images/chap13d2.gif] * 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: [http://www.rapidq.it/public/hell_editor/homepages/images/chap13d3.gif] 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): [http://www.rapidq.it/public/hell_editor/homepages/images/chap13d4.gif] 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