OpenGl-生成曲面

OpenGl-生成曲面,opengl,graphic,Opengl,Graphic,我正在尝试在OpenGl中创建曲面。但我看到的是这样的情况: 这是我制作曲面的功能: GLfloat glObject::y_surf(GLfloat x, GLfloat z, GLfloat A, GLfloat k, GLfloat kat) { return (A - sqrt(x*x + z*z))*sin((A - sqrt(x*x + z*z))*k + kat); } void glObject::MakeSurf(GLfloat a, GLfloat b, GLfloat

我正在尝试在OpenGl中创建曲面。但我看到的是这样的情况:

这是我制作曲面的功能:

GLfloat glObject::y_surf(GLfloat x, GLfloat z, GLfloat A, GLfloat k, GLfloat kat)
{
return (A - sqrt(x*x + z*z))*sin((A - sqrt(x*x + z*z))*k + kat);
}


void glObject::MakeSurf(GLfloat a, GLfloat b, GLfloat A, GLfloat k, GLfloat delta, GLfloat kat)
{
GLfloat x;
GLfloat z;

BeginObject(GL_TRIANGLES);

// wierzcholki fasety 
float v1[3];
float v2[3];
float v3[3];
float v4[3];

// normalna
float N[3];

SetColor(0.5, 0.0, 0.0);

x = -a;


while (x <= a) // iteruj wzdluz OX az nie uzyskasz x=a
{
    z = -b;

    while (z <= b)
    {
        v1[0] = x; v1[1] = y_surf(x, z, A, k, kat); v1[2] = z;
        v2[0] = x; v2[1] = y_surf(x, z + delta, A, k, kat); v2[2] = z + delta;
        v3[0] = x + delta; v3[1] = y_surf(x + delta, z, A, k, kat); v3[2] = z;
        v4[0] = x + delta; v4[1] = y_surf(x + delta, z + delta, A, k, kat); v4[2] = z + delta;

        // pierwszy trojkat
        CalcNormal(v1, v2, v3, N);
        Normalize(N);
        SetNormal(v1[0], v1[1], v1[2]);
        AddVertex(v1[0], v1[1], v1[2]);
        SetNormal(v2[0], v2[1], v2[2]);
        AddVertex(v2[0], v2[1], v2[2]);
        SetNormal(v3[0], v3[1], v3[2]);
        AddVertex(v3[0], v3[1], v3[2]);

        //drugi trojkat 
        CalcNormal(v1, v3, v4, N);
        Normalize(N);
        SetNormal(v1[0], v1[1], v1[2]);
        AddVertex(v1[0], v1[1], v1[2]);
        SetNormal(v3[0], v3[1], v3[2]);
        AddVertex(v3[0], v3[1], v3[2]);
        SetNormal(v4[0], v4[1], v4[2]);
        AddVertex(v4[0], v4[1], v4[2]);

        z = z + delta;
    }
    x = x + delta;
}

EndObject();
}

这是可行的,为什么?

似乎你把顶点放错地方了。另一个三角形应为v2、v3、v4。此外,法线不应取自v,而应取自N(但这超出了本问题的范围)

//drugi trojkat
CalcNormal(v1,v3,v4,N);
正常化(N);
SetNormal(v2[0],v2[1],v2[2]);

AddVertex(v2[0],v2[1],v2[2]);//v2是否希望拥有更多多边形以获得更详细的曲面?在这种情况下,您可能需要修改
增量。还是你只是不想有空隙?在这种情况下,可能需要将PolygonMode更改为
GL\u FILL
auto Y = [](GLfloat x, GLfloat z, GLfloat A, GLfloat k, GLfloat fi)->GLfloat{
    return (A - sqrt(x*x + z*z))*sin((A - sqrt(x*x + z*z))*k + fi); };
    //drugi trojkat 
    CalcNormal(v1, v3, v4, N);
    Normalize(N);
    SetNormal(v2[0], v2[1], v2[2]);
    AddVertex(v2[0], v2[1], v2[2]); // v2 <- here
    SetNormal(v3[0], v3[1], v3[2]);
    AddVertex(v3[0], v3[1], v3[2]);
    SetNormal(v4[0], v4[1], v4[2]);
    AddVertex(v4[0], v4[1], v4[2]);