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

C++ 如何从显式方程构造多边形?,c++,opengl,3d,C++,Opengl,3d,假设我有一个可以在OpenGL中表示对象形状的显式方程,我应该如何从显式方程中“绘制”出形状 例如,我有一个明确的等式: u和v都是实数的成员 然后我尝试在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

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

例如,我有一个明确的等式:

u
v
都是实数的成员

然后我尝试在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();
float maxParts=20;
向量点(3);
glBegin(GLU四条带);

对于(int i=0;i而言,您的方向通常是正确的。但是,您错过了关键步骤,即必须将面片拆分为更小的四边形(将其细分)。因此,您不仅要迭代采样点,还要迭代面片,并且必须为每个面片生成4个采样点

还需要提供顶点法线。顶点法线通过向量δ{x,y,z}/δu和δ{x,y,z}/δv的叉积给出

因评论而编辑

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

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);
    }
}
const int patches\u x,patches\u y;
常数浮点块大小x,块大小y;
int-px,py;
对于(px=0;px
这绝对不是一件小事。首先,你必须了解四边形条带原语的工作原理。它首先从你定义的前4个顶点绘制一个四边形。然后,它为每一对新的顶点绘制一个四边形,这对顶点由前一个四边形的最后2个顶点和新定义的2个顶点组成。记住这一点,你就会明白你不能随便去迭代形状的点,你必须定义四边形,使它们实际位于形状的表面上。我建议你查阅三角形条带化,以获得关于这个主题的一些见解。你是对的。如果我像上面那样循环三角形条带,同样的事情也会发生因为循环是线性的,所有的点都连接成一条线。但是我想不出其他方法来找出曲面上可以连接成三角形或四边形的顶点。我还能做什么?如果你在使用参数方程,你可能还想在打印时调整步长(例如,取决于参数方程的导数)。否则,您可能会得到一些多边形非常小的区域(质量很低),而其他区域的多边形太多(如果降低步长以使前一个看起来更好,则性能会很低)。我在问题中发布的代码使用循环,因此坐标点以线性序列进行迭代。我也曾想过通过面片进行迭代,但仅使用循环是否可行?我如何以类似于上、下、左、右的顺序循环坐标,而不是我现在的从左到右迭代的顺序ght线性?@xEnOn:在面片上循环通常比动态调整循环迭代次数和步长以沿边遍历更容易。您可能希望将其分为两个过程。首先生成顶点(第一个循环保持不变)在过去的几个小时里,我一直在尝试,但是仍然无法找到一个算法来循环补丁,而不是线性的点。在这上面有没有任何代码或演示?抱歉,因为我对OpenGL和C++很新。