0

我的程序中有剥离表面的问题。

我使用 OpenGL(Tao) 渲染了一些表面。我使用triangle_strip。为了获得良好的 3D 印象,我使用照明。法线设置正确。

起初我使用crossProduct,现在我使用隐式函数的推导。两种方法似乎都给出了正确的结果,由于精度,推导可能更好。我在表面上看到垂直条纹。带中的两个相邻三角形具有不同的色调/阴影。1,3,5,7 ... 和 2,4,6... 具有相同的色调/阴影。视角越小,差异越大。90°就可以了。

我怎样才能摆脱条纹?

在这里你可以看到图片: 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

初始化:

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