- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在学习 OpenGL,我想要一个中间有轻微隆起的表面。我目前正在使用这段代码,但我不确定如何调整 ctrl 点以使其成为我想要的方式。它目前像
我希望它是这样的:
我不完全确定我应该使用哪些控制点,而且我对它的工作原理感到困惑。
#include <stdlib.h>
#include <GLUT/glut.h>
GLfloat ctrlpoints[4][4][3] = {
{{-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0},
{0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}},
{{-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0},
{0.5, -0.5, 0.0}, {1.5, -0.5, -1.0}},
{{-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0},
{0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}},
{{-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0},
{0.5, 1.5, 0.0}, {1.5, 1.5, -1.0}}
};
void display(void)
{
int i, j;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix ();
glRotatef(85.0, 1.0, 1.0, 1.0);
for (j = 0; j <= 8; j++) {
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
glEnd();
}
glPopMatrix ();
glFlush();
}
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
0, 1, 12, 4, &ctrlpoints[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w,
5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
else
glOrtho(-5.0*(GLfloat)w/(GLfloat)h,
5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
最佳答案
编辑:我以为你在试验,但我看到代码来自 the OpenGL tutorial .我浏览了一下,现在明白你的意思了。很难从那里学习基础知识。
掌握 NURBS 的最佳方法是交互式地使用它。然后,您将获得关于边缘定义点(在边缘上)、形状定义点(每个其他点)、它们之间的切线关系和连续性的直觉。 NURBS 可以由补丁组成,在边缘缝合在一起,连续性受到高度控制——也就是说,你可以要求 G3 用于汽车主体,或者 C1 用于廉价游戏模型。很难从任何描述中得到这个概念。如果您想以这种方式获得它,我强烈建议您试用 Rhino Nurbs Modeller .我几年前用过它,现在它似乎被遗弃了,但它仍然是具有最好的 NURBS 支持的软件之一(Autodesk 3d Studio MAX 和 MAYA 更差)。虽然这可能有点耗时,但对于初学者我建议玩一些更简单的东西;从 "Simple Bezier Curve Editor" page 中获取小程序转一转。
要了解NURBS,引用Wikipedia Article about Bezier Curves也不错.一旦掌握了点位置和最终曲线形状之间的关系,就可以轻松地将其推广到曲面。我发现这个动画非常直观:
您可以将示例中的曲面想象成一组四个这样的曲线,上面覆盖着一 block 布。使用我之前链接的小程序,您可以调整位置并获得对生成的形状的即时反馈。请注意 t
参数 - 它是沿曲线的坐标,范围为 [0, 1]。 NURBS 曲面有两个坐标,按照惯例称为 u
和 v
(这对绘图功能很重要)。
因此,代码中的 ctrlpoints
结构包含所有点坐标。为了便于解释,这些是四个三次方贝塞尔曲线(动画中的曲线)。对于每条曲线,您在 3 个维度内有四个点。如果忽略 Y 轴,则它们都位于一个网格上,X 和 Z 分别为:-1.5、-1.0、1.0、1.5。这解释了总共 32 个值(X 为 4x4,Z 为 4x4)。
剩下的就是高度,Y值。在您的例子中,它是 ctrlpoints
中每个点的第二个值。为了获得预期的结果,您可以使所有 Y 值在边缘(外部)相等,并在中间(4 个内部)略微升高。你会得到:
用于渲染上图的点:
GLfloat ctrlpoints[4][4][3] = {
{{-1.5, 1.0, -1.5}, {-0.5, 1.0,-1.5 }, {0.5, 1.0, -1.5 }, {1.5, 1.0,-1.5}},
{{-1.5, 1.0, -0.5}, {-0.5, 2.0,-0.5 }, {0.5, 2.0, -0.5 }, {1.5, 1.0,-0.5}},
{{-1.5, 1.0, 0.5}, {-0.5, 2.0, 0.5 }, {0.5, 2.0, 0.5 }, {1.5, 1.0, 0.5}},
{{-1.5, 1.0, 1.5}, {-0.5, 1.0, 1.5 }, {0.5, 1.0, 1.5 }, {1.5, 1.0, 1.5}}
};
// ^ ^ ^ ^
// | | | |
// | | | |
// \_________ Those are most relevant - Y-coord, height ______/
我看到 OpenGL API 隐藏了非常相关的细节。 NURBS 曲面使用 Evaluator
绘制,并使用 Map
函数定义。
您应该在 init(void)
函数中定义控制点,如下所示:
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
0, 1, 12, 4, &ctrlpoints[0][0][0]);
可以找到函数的很好解释 on the MSDN Site for glMap2f .我们正在传递控制点、它们的类型以及数组步幅和顺序等细节。
您可以使用 Evaluator
函数绘制它。它以两个坐标作为参数并返回 3d 空间中的一个点。那些输入坐标正是我前面提到的u
和v
,在动画下。在我们的示例中:
glBegin(GL_LINE_STRIP); // we'll draw a line
// take 31 samples of a cross-section of the surface
for (i = 0; i <= 30; i++)
// for each sample, evaluate a 3d point
glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
// notice j is constant in the loop here, but
// is being changed by the outer loop.
//
// j is iterated in 9 steps, so we'll end up
// with 9 lines
glEnd();
我特意省略了外层循环,这里是这样描述的:
// we want 9 lines
for (j = 0; j <= 8; j++) {
// OpenGL state machine will be used to draw lines
glBegin(GL_LINE_STRIP);
// inner loop for j-th line along X
glBegin(GL_LINE_STRIP);
// inner loop for j-th line along Z
glEnd(); // done with the lines
}
#include <stdlib.h>
#include <GL/glut.h>
GLfloat ctrlpoints[4][4][3] = {
{{-1.5, 1.0, -1.5}, {-0.5, 1.0,-1.5 }, {0.5, 1.0, -1.5 }, {1.5, 1.0,-1.5}},
{{-1.5, 1.0, -0.5}, {-0.5, 2.0,-0.5 }, {0.5, 2.0, -0.5 }, {1.5, 1.0,-0.5}},
{{-1.5, 1.0, 0.5}, {-0.5, 2.0, 0.5 }, {0.5, 2.0, 0.5 }, {1.5, 1.0, 0.5}},
{{-1.5, 1.0, 1.5}, {-0.5, 1.0, 1.5 }, {0.5, 1.0, 1.5 }, {1.5, 1.0, 1.5}}
};
void display(void)
{
int i, j;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix();
glRotatef(25.0, 1.0, 1.0, 1.0);
for (j = 0; j <= 8; j++) {
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
glEnd();
}
glPopMatrix();
glFlush();
}
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
0, 1, 12, 4, &ctrlpoints[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w,
5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
else
glOrtho(-5.0*(GLfloat)w/(GLfloat)h,
5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
关于c - OpenGL NURBS 曲面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500458/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭去年。 Im
我无法解读形状 NURBSTo 条目(用于样条曲线 - 弯曲边缘)中 NURBS 公式的各个参数。 MS Visio 文档帮助不大。 参数的数量是可变的,具体取决于曲线的复杂程度。一个更简单的例子是:
我一直在使用 NURBS 实现进行参数化设计 geomdl在 python 。问题是它是空心的,不能用 cgal 或 3dprinted 处理。我正在寻找一种通过关闭顶部和底部使其防水的方法。我已经尝
编辑:这是一个库错误。我 reported它到 HOpenGL 邮件列表。 我使用 9 点矩形方法将圆/椭圆表示为 NURBS。 点是p1, p2, ..., p9 , p9 = p1 .它们如图所示
我正在使用gluNurbsCurve绘制一些带有一些控制点的曲线。我已经按照红皮书中描述的方式正确运行了基本设置,并且正在尝试对其进行扩展。 该示例如下所示: float knots[8] = {0,
我有一个 NURBS surface它有 4 个弯曲的边缘。 (我有曲线的 4 个贝塞尔点) 我想用轴上的切片平面(不如 3DSMAX 先进!)对 NURBS 曲面进行切片,并计算切片平面和 NURB
我正在实现 NURBS 曲面。我想要的只是在每次鼠标单击时 Y 轴上都有递减,所以它看起来像是有太阳或其他行星的重量。 #include #include int PI = 3.145; int
我对 jogl 中的 nurbs 做了一些研究,但不幸的是没有得到合适的结果,我怀疑 jogl不支持nurbs?如果 jogl 支持,谁能指导我查看示例或文献? 最佳答案 您可以找到有关 GLU(包含
我必须编写一个 C++ 程序,根据未组织的点列表,计算这些点所在的近似曲面并生成相应的 NURBS。我已经看过 OpenNurbs,但没有这方面的功能,而 libNURBS 但包含的功能被标记为“研究
过去一周我一直面临这个问题。对于我当前的项目,我需要绘制 NURBS 曲线,该项目已经使用了 OpenNURBS,但我无法弄清楚如何使用它。 我的问题是,如何从几个控制点得到曲线点? 我做了很多搜索,
我正在学习 OpenGL,我想要一个中间有轻微隆起的表面。我目前正在使用这段代码,但我不确定如何调整 ctrl 点以使其成为我想要的方式。它目前像 我希望它是这样的: 我不完全确定我应该使用哪些控制点
您可以使用 DirectX 11 在 GPU 上渲染 NURBS 吗?我一直在阅读有关渲染此类表面的当前趋势,但在 NURBS 上没有看到任何内容。 我找到了一些相关的引用资料,但没有什么可靠的……比
你能推荐一些库来操作 Delphi 可用的样条线吗?我做了一些搜索,但我发现的所有内容都有 C/C++/Python 绑定(bind)。我需要的功能是: 在 2D 中操作样条线:旋转、平移、镜像、缩放
我有一条 Nurbs 曲线(控制点、结 vector 、权重和 3 或 4 度)。我可以使用参数 t [0, 1] 沿曲线采样来计算长度。计算沿曲线的距离之和可得出曲线的近似长度。 有没有更好的方法来
给定一个包含一个 BSpline/NURBS 曲面的 Blender 文件(例如,Add -> Surface -> NURBS Sphere),我有兴趣导出它的控制多边形(定义它的 3D 点) )
我需要在 OpenGL 中绘制 NURBS 曲线的控制点和节点。控制点没有问题,因为它们是由它们的坐标定义的。但是,我在打结方面遇到了更多麻烦。 我有一个由 gluNurbsCurve 获取的结数组函
我需要创建一个具有两个端点和“n”个控制点的样条。 据我所知,贝塞尔曲线只允许一个控制点,而贝塞尔样条允许两个控制点。但是,我需要能够添加我认为合适的任意数量的控制点,而不限于一两个。 这是我想要实现
我需要一些帮助来在 webGL 中渲染 NURBS 曲面。几天前,我们的教授让我们用 NURBS 绘制一面旗帜并为其制作动画。我们必须使用 webGL(不能使用 trhee.js...)。我不知道如何
我正在使用 OpenGL 创建一个 nurbs 曲面 (gluNurbSurface(...)),我想知道如何将控制点(黑点)的正常值作为红点到达曲面市场。有了这些信息,我就能计算出它们之间的距离。
在 OpenGL 中,可以使用 evaluators 绘制 NURB 。但评估者似乎是 removed遵循 OpenGL ES 规范,使其轻量级。那么,如何使用 OpenGL ES API 绘制 NU
我是一名优秀的程序员,十分优秀!