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.