我正在尝试在 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 个数组,但如果我可以进行简化以减少使用,请让我知道),以及如何将它们映射以形成立方体形状?
让我们看看单个面:如果我们想要一个圆角矩形,我们需要创建一个具有十六个顶点的面:八个网格点和八个控制点,排列on-off-off-on
在每个角上。
假设我们想要半径为的圆角d
。这很愚蠢,但应该是这样r
,但我用这封信画了它d
,所以让我们继续吧:
我们几乎可以轻松找出每个角的顶点p1
和p2
位置,因为它们将d
远离(虚拟)角顶点。离网格控制点的放置有点棘手,但我们可以简单地依靠其他人为我们完成繁重的数学计算:对于视觉上的圆角和半径d
(在本例中),如果点p1
是d
距角点顶点的距离,则控制点距角点的c1
距离。(1 - 0.55228) * d
我本来可以写成 0.44772,但是当涉及到使用三次贝塞尔曲线来近似四分之一圆时,0.55228 是一个神奇的值,所以我宁愿保持它的明确性(在你的代码中,你当然可能想要使用 0.44772)。
现在的技巧是立方体上的所有六个面共享其边缘顶点,因此您最终会得到一个 32 个顶点的对象。我不太熟悉 OpenGL 的做法,但如果您知道如何从顶点构造贝塞尔曲线对象,这就是如何确定获得圆角立方体所需的顶点!