用贝塞尔曲线创建圆形立方体?

Rom*_*der 0 c++ opengl bezier

我正在尝试在 OpenGL 中制作一个带有圆角的立方体,如果你要打磨角,那么就像一个模具,或者那些新奇的填充椅子之一。

据我了解,贝塞尔曲线似乎是解决此问题的最佳方法,但我确定如何将它们缝合在一起以形成我想要的立方体。我已经成功地将两条贝塞尔曲线放在一起,形成了一个“扁鱼状”三角形实体(参见下面的代码),但每当我尝试将其扩展到立方体时,我总是会得到一些奇怪的非凸令人厌恶的东西。

//Draw left side of fish
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlptsLeft[0][0][0]);
glMapGrid2f(uSteps, 0.0, 1.0, vSteps, 0.0, 1.0);
glEvalMesh2(GL_FILL, 0, uSteps, 0, vSteps);

//Draw right side of fish
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlptsRight[0][0][0]);
glMapGrid2f(uSteps, 0.0, 1.0, vSteps, 0.0, 1.0);
glEvalMesh2(GL_FILL, 0, uSteps, 0, vSteps);

/* uSteps and vSteps are defined elsewhere as constants - the number of steps to use in drawing    the surface. Likewise, the control point arrays are similarly defined elsewhere.*/
Run Code Online (Sandbox Code Playgroud)

对于立方体,具体来说,我想知道需要多少个控制点数组来完全定义它(我假设我需要 6 个表面,因此需要 6 个数组,但如果我可以进行简化以减少使用,请让我知道),以及如何将它们映射以形成立方体形状?

Mik*_*ans 5

让我们看看单个面:如果我们想要一个圆角矩形,我们需要创建一个具有十六个顶点的面:八个网格点和八个控制点,排列on-off-off-on在每个角上。

假设我们想要半径为的圆角d。这很愚蠢,但应该是这样r,但我用这封信画了它d,所以让我们继续吧:

呜呜呜呜

我们几乎可以轻松找出每个角的顶点p1p2位置,因为它们将d远离(虚拟)角顶点。离网格控制点的放置有点棘手,但我们可以简单地依靠其他人为我们完成繁重的数学计算:对于视觉上的圆角和半径d(在本例中),如果点p1d距角点顶点的距离,则控制点距角点的c1距离。(1 - 0.55228) * d我本来可以写成 0.44772,但是当涉及到使用三次贝塞尔曲线来近似四分之一圆时,0.55228 是一个神奇的值,所以我宁愿保持它的明确性(在你的代码中,你当然可能想要使用 0.44772)。

现在的技巧是立方体上的所有六个面共享其边缘顶点,因此您最终会得到一个 32 个顶点的对象。我不太熟悉 OpenGL 的做法,但如果您知道如何从顶点构造贝塞尔曲线对象,这就是如何确定获得圆角立方体所需的顶点!