OpenGl - 制作表面
OpenGl - making surface
我正在尝试在 OpenGl 中创建表面。但我看到了这样的事情:
http://i62.tinypic.com/2z7psow.png
这是我制作表面的功能:
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();
}
我的视觉项目:
https://www.dropbox.com/s/vu5n1cluzhixdwi/Proj4.rar?dl=0
谁能帮我看看我应该怎么做才能使这个表面光滑?
编辑
但是当我将函数 "y_surf" 替换为:
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); };
有效,为什么?
您似乎放错了顶点。另一个三角形应该是 v2、v3、v4。此外,法线不应取自 v,而应取自 N(但这超出了本问题的范围)。
//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]);
我正在尝试在 OpenGl 中创建表面。但我看到了这样的事情: http://i62.tinypic.com/2z7psow.png
这是我制作表面的功能:
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();
}
我的视觉项目:
https://www.dropbox.com/s/vu5n1cluzhixdwi/Proj4.rar?dl=0
谁能帮我看看我应该怎么做才能使这个表面光滑?
编辑
但是当我将函数 "y_surf" 替换为:
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); };
有效,为什么?
您似乎放错了顶点。另一个三角形应该是 v2、v3、v4。此外,法线不应取自 v,而应取自 N(但这超出了本问题的范围)。
//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]);