0

プログラムで剥がれた表面に問題があります。

OpenGL(Tao) を使用していくつかのサーフェスをレンダリングします。私はtriangle_stripを使用しています。3D の印象を良くするために、照明を使用します。法線は正しく設定されています。

最初は crossProduct を使用していましたが、現在は陰関数の派生を使用しています。どちらの方法でも正しい結果が得られるようですが、精度のために導出の方が優れている場合があります。表面に縦縞が見えます。ストリップ内の隣接する 2 つの三角形の色相/色合いが異なります。1,3,5,7 ... と 2,4,6 ... は同じ色相/色合いです。視野角が小さいほど、その差は大きくなります。90°でOKです。

どうすれば縞模様を取り除くことができますか?

ここで画像を見ることができます: ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

初期化:

private float[] materialAmbient = { 1.0f, 1.0f, 1.0f, 1.0f };
private float[] materialDifuse = { 0.6f, 0.6f, 0.6f, 1.0f };
private float[] materialOdlesky = { 0.2f, 0.2f, 0.2f, 1.0f };
private float[] materialShininess = { 50.0f };
private float[] light_position = { 0.0f, 0.0f, 1.0f, 1.0f};
private float[] light_color = { 0.7f, 0.7f, 0.7f }

Gl.glShadeModel(Gl.GL_SMOOTH);
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glHint(Gl.GL_LINE_SMOOTH_HINT, Gl.GL_NICEST);
Gl.glDepthFunc(Gl.GL_LESS);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);

Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT, materialAmbient);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE, materialDifuse);  
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SPECULAR, materialOdlesky); 
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SHININESS, materialShininess);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light_position);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, light_color); 
Gl.glLightModeli(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_TRUE);  
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);

描画コード:

double foo = 15;
        for (double v = -foo; v < foo; v += vStep)
        {
            if (v > foo - vStep)
                v = foo - vStep;
            Gl.glBegin(Gl.GL_TRIANGLE_STRIP);
            Gl.glColor3dv(_color);
            for (double u = -foo; u < foo + uStep; u += uStep)
            {
                if (u > foo)
                    u = foo;
                SetVextexAndHisNormal(u, v);
                SetVextexAndHisNormal(u, v + vStep);
                if (u == foo)
                    break;
            }
            Gl.glEnd();
            if (v == foo - vStep)
                break;
        }


 public void SetVextexAndHisNormal(double u, double v)
    {
        Vector v1 = ComputeCoordinatesAt(u, v);
        double x = (-2 / (_a + _a)) * v1.GetX();
        double y = (2 / (_b + _b)) * v1.GetY();
        double z = -2*_k;
        Vector normal = new Vector(x, y, z);
        normal.NornVector();

        Gl.glNormal3d(_normalSign * normal.GetX(), _normalSign * normal.GetY(), _normalSign * normal.GetZ());
        Gl.glVertex3d(v1.GetX(), v1.GetY(), v1.GetZ());
    }
4

0 に答える 0