我正在学习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 …Run Code Online (Sandbox Code Playgroud) 编辑:这是一个库bug.我把它报告给HOpenGL邮件列表.
我使用9点矩形方法将圆/椭圆表示为NURBS.
要点是p1, p2, ..., p9,p9 = p1.它们如图所示:
y2 | p2 p3 p4
y1 | p1 p5
y0 | p8 p7 p6
-------------
| x0 x1 x2
x1 = (x0 + x2) / 2
y1 = (y0 + y2) / 2
Run Code Online (Sandbox Code Playgroud)
即p1 = (x0, y1), p2 = (x0, y2)等等.
重量是:
1中间点(p1,p3,p5,p7)sqrt(0.5)角点(p2,p4,p6,p8)我使用两种方法将权重应用为齐次坐标:
(x,y)重量w变成了Vertex4 (w*x) (w*y) 0 w我再次陷入困境,所以请耐心等待。
我有一个 B 样条线(从 Solidworks 导入),可以使用 python 中的 geomdl 进行分析。
从 geomdl 中,我可以提取样条曲线上任何给定点的一阶和二阶导数以及切线、法线和副法线向量。
从那里我可以根据一阶和二阶导数计算该点的曲率。
但是我无法确定曲线转向的方向。
我想找到位于 bspline 上当前感兴趣点的曲率中心的点。
我“认为”切向量和法向量都位于感兴趣的密切平面上。然后叉积将给出密切平面的法线。但是我无法完成这项工作。
至少我需要知道曲线向哪个方向弯曲。即顺时针或逆时针。
但如果我有一个位于曲率中心的点,我几乎就会知道关于该点的一切。
它是否正确?
重申一下问题:
给定一个点、该点处曲线的导数以及切线、法线和双法线向量,如何找到曲率中心?
我gluNurbsCurve用来画一些控制点的曲线。我已经按照红皮书中的描述进行了基本设置,可以正常工作,并且我正在尝试对其进行扩展。
该示例如下所示:
float knots[8] = {0,0,0,0,1,1,1,1};
float pnts[4][3] = { {...},{...},{...},{...} };
GLUnurbsObj *m = gluNewNurbsRenderer();
gluBeginCurve(n);
gluNurbsCurve(n, 8, knots, 3, pnts, 4, GL_MAP1_VERTEX_3)
gluEndCurve(n);
Run Code Online (Sandbox Code Playgroud)
我想知道的一件事是结数据的含义。它如何影响结果?我在那里还能尝试其他什么选择?
由于某种原因,我找不到任何可以正确解释此问题的教程。
RedBook中的NURBS章节已被弃用,包括实用程序库:"尽管其中一些功能是GLU库的一部分,但它依赖于已从核心OpenGL库中删除的功能."
这是否意味着OpenGL 4.2实际上缺少用于操纵NURBS曲线和曲面的C++工具包?有一些商业第三方工具包,但它们不是跨平台(主要是windows)
...?
我正在制作一个项目,用点和线(弯曲或不弯曲)制作简单的 3d 模型。对于第一个版本,我使用 SVG 元素进行简单渲染、平滑曲线和鼠标事件。
现在我正在尝试使用Three.js渲染器而不是 SVG。我必须创建 3d 管来替换曲线,但我不知道如何基于多个 xyz 坐标创建 3d 曲面。
这是一个由 4 个点和 4 条线(3 条直线和 1 条曲线)组成的模型示例:
我们可以想象曲线被挤压成更多的点,像这样:
然后我想创建一个表面(或平面),就像蓝色形状一样:
我受到了这个话题的启发:在three.js中将贝塞尔曲线转换为平面道路
var material = new THREE.MeshBasicMaterial({ color: 0xc0c0c0 });
var path = new THREE.CatmullRomCurve3([
new THREE.Vector3(dots[0].x, dots[0].y, -dots[0].z),
new THREE.Vector3(dots[1].x, dots[1].y, -dots[1].z),
new THREE.Vector3(dots[2].x, dots[2].y, -dots[2].z),
new THREE.Vector3(dots[3].x, dots[3].y, -dots[3].z),
new THREE.Vector3(dots[0].x, dots[0].y, -dots[0].z)
]);
var pts = [],
a ;
for (var i = 0 ; i < 3 ; i++) …Run Code Online (Sandbox Code Playgroud) 按照这个主题,我尝试生成一个3D弯曲三角形作为NURBS曲面,但是我不知道如何设置3D点来实现。
这是当前的实现:
var edges = this.getEdges(), // An edge is a line following 4 dots as a bezier curve.
dots = self.getDotsFromEdges(edges), // Get all dots in order for building the surface.
ctrlPoints = [ // Is generated only once before, but copy-pasted here for this sample code.
[
new THREE.Vector4(0, 0, 0, 1),
new THREE.Vector4(0, 0, 0, 1),
new THREE.Vector4(0, 0, 0, 1),
new THREE.Vector4(0, 0, 0, 1)
],
[
new THREE.Vector4(0, 0, 0, 1),
new THREE.Vector4(0, …Run Code Online (Sandbox Code Playgroud) 我很好奇NURBS是如何在GPU/OpenGL图形管道中渲染的.我知道在OpenGL和GLUT中有各种调用,可以使用glMap和glMapGrid从编码角度轻松渲染NURBS对象,但我没有得到的是OpenGL完成此过程的过程.NURBS背后的想法是使用曲线来定义曲面,而图形管道似乎围绕三角形栅格化和三角形网格构建,而NURBS基于Bezier曲线,它们是弯曲的.
那么,从(高级)管道角度来看,NURBS实际上是如何实现的呢?