作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有一个可以在 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 坐标的显式方程以从方程构建形状?
最佳答案
您通常会朝着正确的方向前进。但是你错过了关键的一步,你必须将补丁分成更小的四边形(镶嵌它)。因此,您不仅要迭代采样点,还要迭代补丁,并且必须为每个补丁生成 4 个采样点。
您还需要提供顶点法线。顶点法线通过 vector δ{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);
}
}
关于c++ - 如何从显式方程构造多边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7704528/
我是一名优秀的程序员,十分优秀!