0

滑らかなシェーディングで独自のトーラスを作成しようとしています。しかし、通常は間違っているようです。これが私のコードです。

GLfloat NoMat[]             =   {   0.0f,   0.0f,   0.0f,   1.0f    };
GLfloat MatAmbient[]        =   {   0.7f,   0.7f,   0.7f,   1.0f    };
GLfloat MatAmbientColor[]   =   {   0.21f,  0.13f,  0.05f,  1.0f    };
GLfloat MatDiffuse[]        =   {   0.71f,  0.43f,  0.18f,  1.0f    };
GLfloat Shine               =   100.0f; 
GLfloat NoShine             =   0.0f;

glMaterialfv(GL_FRONT, GL_AMBIENT, MatAmbientColor);
glMaterialfv(GL_FRONT, GL_DIFFUSE, MatDiffuse);
glEnable(GL_NORMALIZE);

glMaterialfv(GL_FRONT, GL_SPECULAR, MatAmbient);
glMaterialf(GL_FRONT, GL_SHININESS, Shine);

int i, j, k;
double s, t, x, y, z;

for (i = 0; i < nsides; i++) {
    glBegin(GL_QUAD_STRIP);
    for (j = 0; j <= rings + 1; j++) {
        for (k = 1; k >= 0; k--) { //for both negative and positive
            s = (i + k) % nsides + 0.5;
            t = j % rings;

            x = (totalRadius + centerRadius * cos(s*2*M_PI/nsides)) * cos(t*2*M_PI/rings);
            z = (totalRadius + centerRadius * cos(s*2*M_PI/nsides)) * sin(t*2*M_PI/rings);
            y = centerRadius * sin(s*2*M_PI/nsides);
            glVertex3f(x, y, z);
            glNormal3f(x, y, z);
        }
    }
    glEnd();
}

ただし、ライティングはスムーズ シェーディングではなくフラット シェーディングのように動作するため、適切に機能しません。私はいくつかのグーグルをしましたが、どうやら私は差別化を使う必要があるようです。ただし、これを行う方法がよくわかりません。誰でも何か考えがありますか?

4

1 に答える 1

4

法線の頂点位置を使用していますか? これは、単位半径の球に対してのみ (そしてのみ) 機能します!

法線を計算する必要があります。あれは

δ{x,y,z}/δs × δ{x,y,z}/δt

トーラスの優れた点は、数値近似を使用する代わりに、紙の上で簡単に評価できることです。正確な式が得られます。

于 2011-10-15T09:44:29.403 に答える