假设我有一个可以在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();
但事实证明这真的很糟糕。上面的代码稍微给出了一个形状的轻微印象,但多边形没有正确呈现。我应该如何迭代x,y和z坐标的显式方程,从等式中构造形状?
答案 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);
}
}