在opengl中将立方体转换为球体

时间:2015-03-03 12:06:01

标签: c++ opengl geometry normals

我使用三角形方法构建了一些立方体(每个立方体24个顶点)。

现在我想将这个立方体转换为一个球体(也许,我只想要有圆角)(后来,我想为这个转换设置动画)。

我怎么能意识到这一点?我可以使用纹理坐标或法线来做到这一点吗? 我找到了这个thread,但它对我没有帮助。

2 个答案:

答案 0 :(得分:1)

您可以将每个点缩放到球体

让我们说你的分数是x [i],然后给球体带点,你做

x[i] = x[i] * radius / norm( x[i] )

假设您的多维数据集以0为中心

如果你想插入这个,看起来很简单

我不是说它有效,但在我看来它应该起作用

答案 1 :(得分:1)

要使用简单的OpenGL执行此操作,您需要使用多维数据集的更精细细分。不是仅用两个三角形绘制每个面,而是将其细分为更小的块。最简单的曲面细分是将面分割成较小的正方形,然后用三角形条绘制它们。

如果您将每条边分成n块,每个面最终会有n x n个方块或2 * n * n个三角形。

然后,您可以在顶点着色器中在立方体和球体之间进行插值。您绘制原始立方体。通过简单地标准化立方体坐标来获得球体坐标。

在顶点着色器中,InterpFract是插值的一部分(0用于绘制立方体,1用于绘制球体),代码看起来像这样:

uniform float InterpFract;
attribute vec3 CubeCoord;

void main() {
    vec3 sphereCoord = normalize(CubeCoord);
    gl_Position = vec4(mix(CubeCoord, sphereCoord, InterpFract), 1.0);
}

这适用于半径为1的球体。如果您需要不同的半径,则可以将sphereCoord乘以半径。

如果你还需要法线,则需要更多的数学运算。以与插值位置相同的方式对立方体的法线和球面法线进行插值,会产生正确的法线。正确的解决方案是插入梯度向量,然后将法线计算为插值梯度向量的叉积。

使用更高级的OpenGL,您可以避免输入更多顶点,而是使用曲面细分着色器执行面的细分。