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

时间:2014-11-26 00:28:01

标签: c++ opengl bezier

我正在尝试在OpenGL中制作一个圆角的立方体,就像你要在角落里打磨一样,或者是那些新奇的填充椅子之一。

Bezier曲线似乎是我理解的最佳方式,但我确定如何将它们拼接在一起以形成我想要的立方体。我已经取得了一些成功,将两条Bezier曲线组合在一起形成一个“扁平的鱼状”三角形实体(见下面的代码),但每当我尝试将它扩展到一个立方体时,我总会得到一些奇怪的非凸出的憎恶。

//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.*/

对于立方体,特别是我想知道我需要多少个控制点阵列来完全定义它(我假设我需要6个表面,因此需要6个阵列,但如果有一个简化,我可以减少使用,请让我知道),如何将它们映射成立方体形状?

1 个答案:

答案 0 :(得分:1)

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

假设我们想要半径为d的圆角。这很愚蠢而应该是r但是我用字母d画了它,所以让我们滚动它:

ewfwefw

我们可以找出每个角落的顶点p1p2应该几乎无关紧要,因为它们距离(虚拟)角点顶点d。离网控制点的位置有点棘手,但我们可以简单地依赖其他人为我们完成繁重的数学运算:对于视觉圆角和半径d(在这种情况下) ),如果点p1距离角顶点距离d,则控制点c1距角落距离(1 - 0.55228) * d。我可以编写0.44772,但是当使用三次贝塞尔曲线近似四分之一圆时,0.55228是一个神奇的值,所以我宁愿保持它的显式(在你的代码中,你当然可能想要使用0.44772)。

现在的诀窍是,立方体上的所有六个面共享它们的边顶点,因此最终得到一个32顶点对象。我不太熟悉OpenGL这样做的方法,但是如果你知道如何从顶点构造Bezier补丁对象,那么就是如何确定获得圆角立方体所需的顶点!