2015-03-03 93 views
0

我用三角形方法构建了一些Cubes(每个立方体有24个立方体)。将cube转换为opengl中的球体

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

我该如何认识到这一点?我可以使用纹理坐标或法线来做到这一点吗? 我发现这个thread,但它不帮助我。

+0

是否要刻录或限制立方体? – Guiroux 2015-03-03 12:14:24

+0

不,我只想改变几何形状 – 2015-03-03 12:16:11

+3

那么它很简单,你只是将每个点“归一化”为一个向量,而不是1的常态,而是预期的半径的规范 – Guiroux 2015-03-03 12:20:04

回答

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,您可以避免输入更多的顶点,而是使用曲面细分着色器来执行细分。

+0

谢谢,这对我很有用。 – 2015-03-04 07:38:43

1

你可以只采用逐点到球体

让我们说,你的观点是X [I],然后把一个点到球,你做

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

假设你的立方体集中在0,如果你想插这个

,看似简单

我不说,它的工作原理,但它看起来像它应该工作

+0

谢谢,我认为这适用于每个脸部高数量的三角形。我只使用每个脸部2个三角形来减少开销。还有另一个问题吗? – 2015-03-03 16:03:12

+0

对于更多三角形,我在http://mathproofs.blogspot.com.au/2005/07/mapping-cube-to-sphere.html – 2015-03-03 16:04:16

+0

上找到一篇文章,我不明白它是如何“为更多三角形”的,它只是映射某些属性,但都是从3D点映射到3D点 – Guiroux 2015-03-03 16:20:27