如何从显式方程构造多边形?

时间:2011-10-09 15:26:13

标签: c++ opengl 3d

假设我有一个可以在OpenGL中表示对象形状的显式方程式,我应该如何从显式方程中“绘制”出形状?

例如,我有这个明确的等式: enter image description here

uv都是实数的成员。

然后我尝试在OpenGL C ++中执行此操作:

float maxParts = 20;

vector<float> point(3);

glBegin(GL_QUAD_STRIP);
for(int i=0; i<=maxParts; i++) {
    float u = ((float)i/maxParts)*2*M_PI;
    for(int j=-maxParts; j<=maxParts; j++) {
        float v = (j/maxParts) * M_PI;
        point[0] = cos(u) * (4.0+3.8*cos(v));
        point[1] = sin(u) * (4.0+3.8*cos(v));
        point[2] = (cos(v) + sin(v) - 1.0) * (1.0 + sin(v)) * log(1.0-M_PI*v/10.0) + 7.5 * sin(v);
        glVertex3f(point[0], point[1], point[2]);
    }
}
glEnd();

但事实证明这真的很糟糕。上面的代码稍微给出了一个形状的轻微印象,但多边形没有正确呈现。我应该如何迭代x,y和z坐标的显式方程,从等式中构造形状?

1 个答案:

答案 0 :(得分:4)

你通常会朝着正确的方向前进。然而,你错过了关键的一步,你必须将补丁拆分成更小的四边形(详细说明)。因此,您不必迭代采样点,迭代补丁,必须为每个补丁生成4个采样点。

您还需要提供顶点法线。顶点法线是通过取矢量δ{x,y,z} /δuδ{x,y,z} /δv的交叉积来给出的。 p>

由于评论而编辑

发出独立四边形的代码示例:

const int patches_x, patches_y;
const float patch_size_x, patch_size_y;
int px, py;
for(px = 0; px < patches_x; px++) for(py = 0; py < patches_y; py++) {
    const float U = px * patch_size_x;
    const float V = py * patch_size_y;
    {
        float u, v;
        u = U - patch_size_x/2.0;
        v = V - patch_size_y/2.0;
        emit_quad_vertex(u, v);
    }
    {
        float u, v;
        u = U + patch_size_x/2.0;
        v = V - patch_size_y/2.0;
        emit_quad_vertex(u, v);
    }
    {
        float u, v;
        u = U + patch_size_x/2.0;
        v = V + patch_size_y/2.0;
        emit_quad_vertex(u, v);
    }
    {
        float u, v;
        u = U - patch_size_x/2.0;
        v = V + patch_size_y/2.0;
        emit_quad_vertex(u, v);
    }
}