OpenGL: Una classe per Visual Basic

La classe ClsOpenGL è una classe per Visual Basic 5 per collegare mediante interfaccia alla libreria DLL di GLU/OpenGL.

OpenGL è una libreria per oggetti 3D professionale, originariamente prodotta da Silicon Graphics per le sue macchine ed ora portata su molti sistemi: UNIX, Macintosh e Window NT/95/98.

La versione della Microsoft è OpenGL 1.1, con due librerie: OPENGL32.DLL e GLU32.DLL. Queste sono fornite con Windows NT e Windows 95 nelle versioni più recenti, o sono scaricabili dal sito della Microsoft.

OpenGL ha molte funzioni, riguardanti tutti i tipi di manipolazioni 3d: disegno di oggetti, solido e wireframed; sfumatura del colore in base all’illuminazione, con il metodo di Phong ed altri; effetti speciali come la nebbia; primitive come sfera, cono, cilindro, prisma, toro, NURBS (Superfici Razionali Non Uniformi con curve ‘spline’); ecc ecc..

Una guida di riferimento completa alle funzioni di OpenGL è disponibile alla Digital.

Questa classe à dedicata a facilitare l’uso di OpenGL standard: quando molte chiamate alle funzioni OpenGL sono richieste per ottenere un semplice effetto logico, la classe incapsula tutto in un singolo metodo, facile da usare. Ciò può essere, per esempio, nell’inizializazione di un OpenGL ‘rendering context’ (l’ambiente di disegno di OpenGL), dove oltre 20 chiamate a differenti funzioni sono necessarie per definire tutti i parametri: memoria, luci, strutture, parametri di prospettiva, viewport, ecc.

Invece, le funzioni più semplici di OpenGL non sono sovrapposte con metodi, per esempio GLpushmatrix e GLpopmatrix, per salvare e ricaricare la tabella degli assi. In più, è sempre possibile chiamare direttamente una funzione di OpenGL (come indicato negli esempi).

La classe necessita di caricare nel progetto di VB le librerie di riferimento a OpenGL:

  • OpenGL 1.1 v 1.2 (OPENGL32.TLB)
  • GLUT 3.5 v 1.0 (GLUT32.TLB)

di Patrice Scribe – @1997 – (visitate il suo sito dedicato a VB e a OpenGL)

Nelle tabelle successive sono elencati le proprietà ed i metodi esposti dalla classe.

Proprietà pubbliche

hGLRC Long

puntatore al rendering context OpenGL

hPalette Long

puntatore alla palette di colori usata

colorbits Integer

numero di bit di colore usati dal contesto OpenGL: 2=2 colori; 4=16 colori; 8=256 colori; 16=65535 colori; 24=16 milioni

textured Boolean

vale TRUE se le facce degli oggetti/superfici 3D sono ricoperte da texture

wireframed Boolean

vale TRUE se le facce degli oggetti/superfici 3D sono disegnate solo con i bordi (wireframe)

shaded Boolean

vale TRUE se le facce degli oggetti/superfici 3D sono disegnate con la sfumatura di colore

texBitmap Collection

collezione delle textures formato BMP caricate con il metodo LoadBMPImage

GLlist Collection

collezione degli indici delle liste OpenGL create con vari metodi

nurb GLUnurbs

puntatore al rendering context corrente per le NURBS (per disegnare superfici interpolate)

Metodi

completedraw

mostra la finestra OpenGL con tutti gli oggetti disegnati prima

deleteNURBS

cancella il rendering context per le NURBS

drawall

disegna tutti gli oggetti memorizzati nelle liste raccolte nella GLlist della classe

drawlist (lista)

disegna la lista di indice ‘lista’

drawmesh (y() As GLfloat, nx As Integer, nz As Integer, lx As Single, lz As Single, x0 As Single, y0 As Single, precision As Single, matcolor() As GLfloat, lista As Integer) As Integer

memorizza in una lista OpenGL una griglia regolare di quote, approssimata con una serie di superfici NURBS.

y(): una matrice con ‘nx’ righe e ‘nz’ colonne, ogni valore y(ix, iz) è l’altezza Y della griglia nel punto del piano X-Z avente coordinate: x=x0 + lx * ix; z=z0 + lz * iz (ix e iz = 1); nx = righe della griglia; nz = colonne della griglia; lx = intervallo tra due punti consecutivi lungo l’asse X; lz = intervallo tra due punti consecutivi lungo l’asse Z; x0 = coordinata X del punto di origine della griglia; z0 = coordinata Z del punto di origine della griglia; precision = valore che controlla l’accuratezza delle superfici NURBS usate: valori più grandi danno accuratezza minore; matcolor() = un vettore a 4 elementi contenente i valori RGB (da 0 ad 1.0) del colore del materiale, il quarto elemento è il parametro alfa, normalmente vale 1.0; lista = indice dell’elemento nella GLlist che identificherà la griglia in ogni operazione di disegno successiva; se lista=0, DRAWMESH ritorna l’indice associato alla griglia, altrimenti ritorna un valore uguale a ‘lista’

drawNURBS (ctrlpoint() As GLfloat, precision As Single, matcolor() As GLfloat, lista As Integer) As Integer

memorizza in una lista OpenGL una superfice NURBS del terzo ordine.

Questo richiede 16 punti di controllo, nella matrice ‘ctrlpoint’. Questa matrice ha 3 dimensioni: ctrlpoint(0 to 2, 0 to 3, 0 to 3).

Il primo indice identifica le coordinate x, y, z: il secondo e terzo identificano righe e colonne dei punti di controllo.

precision = valore che controlla l’accuratezza delle superfici NURBS usate: valori più grandi danno accuratezza minore; matcolor() = un vettore a 4 elementi contenente i valori RGB (da 0 ad 1.0) del colore del materiale, il quarto elemento è il parametro alfa, normalmente vale 1.0; lista = indice dell’elemento nella GLlist che identificherà la griglia in ogni operazione di disegno successiva; se lista=0, DRAWMESH ritorna l’indice associato alla griglia, altrimenti ritorna un valore uguale a ‘lista’

Glinit (obj)

inizializza il rendering context OpenGL, collegandolo all’oggetto fornito in input form, picturebox. I disegni successivamente saranno perciò visualizzati in quest’oggetto. Molti parametri sono assegnati con valori di default; le proprietà ‘textured’, wireframe’, ‘shaded’ sono lette per dare il corretto aspetto agli oggetti 3D disegnati. La proprietà ‘hGLRC’ contiene il puntatore al rendering context OpenGL assegnato dalle funzioni di inizializzazione.

initdraw

cancella i buffers del colore e della profondità per un nuovo ciclo di disegni

LoadBMPImage (nome As String, nomebitmap As String)

carica una immagine BMP dal file ‘filename’, e la memorizza nella collezione texBitmap con il nome-chiave ‘bitmapname’, pronta per essere usata negli oggetti 3D.

LoadDXFobj (nomedxf As String, dxftex As String, col_r As Single, col_g As Single, col_b As Single) As Integer

carica un oggetto 3D defnito in un file formato DXF, come gruppo di paragrafi 3DFACE; l’oggetto è memorizzato in una lista, il cui indice è ritornato dalla funzione. nomedxf = nome del file DXF da caricare; dxftex = nome-chiave di una texture precedentemente caricata con LoadBMPImage, questa texture viene applicata sopra l’oggetto; se dxftex è una stringa vuota, all’oggetto non viene applicata nessuna texture; col_r, col_g, col_b = componenti RGB del colore dell’oggetto

modrotate (xAngle As Single, yAngle As Single, zAngle As Single)

ruota gli assi correnti (chiamati ‘model view’ nella OpenGL) degli angoli xAngle, yAngle, zAngle, in gradi. Il precedente orientamento degli assi non è salvato.

modtranslate (xDelta As Single, yDelta As Single, zDelta As Single)

sposta gli assi correnti (chiamati ‘model view’ nella OpenGL) delle distanze xDelta, yDelta, zDelta, in unità OpenGL. Il precedente orientamento degli assi non è salvato.

setlight (lnum As Integer, lspot As Boolean, lcolor() As Single, lposition() As Single)

imposta ed attiva una sorgente luminosa OpenGL di indice ‘lnum’ (l’indice può essere uno tra le costanti GL_LIGHT0, GL_LIGHT1, …, GL-LIGHT7. GL_LIGHT0 e GL_LIGHT1 sono definite di default dal metodo GLInit). lspot = vale TRUE se questa è una sorgente ‘spot’, cioè a riflettore; lcolor() = un vettore a 4 elementi contenente i valori RGB (da 0 ad 1.0) del colore della luce, il quarto elemento è il parametro alfa, normalmente vale 1.0; lposition()= un vettore a 4 elementi contenente le coordinate x, y, e z della posizione della sorgente; il quarto valore deve essere sempre 1.0.

setmaterial (matprop() As Single)

imposta le caratteristiche di riflessione della luce per il materiale corrente (AMBIENT e DIFFUSE); matprop() = un vettore a 4 elementi contenente i valori RGB (da 0 ad 1.0) del colore della luce riflessa, il quarto elemento è il parametro alfa, normalmente vale 1.0.

I programmi di esempio sono:

TXOPENGL crea un oggetto clsOpenGL e lo collega ad una picturebox, poi richiede il caricamento di un oggetto 3D DXF e di una texture BMP; l’oggetto 3D è disegnato nella picturebox, e può essere ruotato e traslato da menu o da tastiera

TXMESH crea un oggetto clsOpenGL e lo collega ad una picturebox, poi disegna una superfice con quote casuali usando il methodo DRAWMESH; da menu la griglia è impostabile come solida o wireframed, e con precisione di interpolazione maggiore o minore.

Both comments and pings are currently closed.

Comments are closed.