Parametrikus felületek
Az
(x,y,z) = f(u,v)
alakban megadható felületetek (gömb, tórusz, henger, forgásfelületek, stb.) megjeleníthetők.
A felület pontjai megkaphatók, ha egy dupla ciklussal végig megyünk a paramétereken:
vx = new Vector3[N*M]; nx = new Vector3[N*M]; const float UStep = UMax/N; const float VStep = VMax/M; int idx = 0; for ( float v=0; v<VMax; v += VStep ) for ( float u=0; u<UMax; u += UStep ) { vx[idx] = f(u,v); nx[idx] = -(f(u-UStep,v)-f(u+UStep,v)).crossProduct(f(u,v-VStep)-f(u,v+VStep)); nx[idx].normalise(); ++idx; }
A felületi normálisok kicsit bonyolultabban, a paraméterek menti parciális deriváltak közelítésének vektoriális szorzatával, kaphatók. A Vector3 osztály a vektoriális szorzatot balkéz-rendszerben végzi, ezért az eredményt negálni kell. Hogy a normális hossza egységnyi legyen, normálni kell.
A pontokat elég egyszer kiszámítani, ezután a kirajzolás a következő:
glBegin(GL_QUADS); // valamilyen szin glColor3f(0.7f, 0.7f, 0.2); for ( int v=0; v<M-1; ++v ) // ebben az iranyban nem zart for ( int u=0; u<N; ++u ) // ebben az iranyban igen { const int UNext = (u+1)%N; const int VNext = (v+1)%M; glNormal3fv(nx[v*N+u].ptr()); glVertex3fv(vx[v*N+u].ptr()); glNormal3fv(nx[VNext*N+u].ptr()); glVertex3fv(vx[VNext*N+u].ptr()); glNormal3fv(nx[VNext*N+UNext].ptr()); glVertex3fv(vx[VNext*N+UNext].ptr()); glNormal3fv(nx[v*N+UNext].ptr()); glVertex3fv(vx[v*N+UNext].ptr()); } glEnd();
A felület tényleges alakját az f függvény adja.
A textúra koordináták pl. az u,v értékekből számíthatók:
(s,t) = (u/UMax, v/VMax)
Parametrikus felületekre példa projekt letölthető innen.