我用三角形方法构建了一些Cubes(每个立方体有24个立方体)。将cube转换为opengl中的球体
现在我想将这个立方体转换成一个球体(也许我只想有圆角)(后来我想为这个转换创建动画)。
我该如何认识到这一点?我可以使用纹理坐标或法线来做到这一点吗? 我发现这个thread,但它不帮助我。
我用三角形方法构建了一些Cubes(每个立方体有24个立方体)。将cube转换为opengl中的球体
现在我想将这个立方体转换成一个球体(也许我只想有圆角)(后来我想为这个转换创建动画)。
我该如何认识到这一点?我可以使用纹理坐标或法线来做到这一点吗? 我发现这个thread,但它不帮助我。
要做到这一点与简单的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,您可以避免输入更多的顶点,而是使用曲面细分着色器来执行细分。
谢谢,这对我很有用。 – 2015-03-04 07:38:43
你可以只采用逐点到球体
让我们说,你的观点是X [I],然后把一个点到球,你做
x[i] = x[i] * radius/norm(x[i])
假设你的立方体集中在0,如果你想插这个
,看似简单
我不说,它的工作原理,但它看起来像它应该工作
谢谢,我认为这适用于每个脸部高数量的三角形。我只使用每个脸部2个三角形来减少开销。还有另一个问题吗? – 2015-03-03 16:03:12
对于更多三角形,我在http://mathproofs.blogspot.com.au/2005/07/mapping-cube-to-sphere.html – 2015-03-03 16:04:16
上找到一篇文章,我不明白它是如何“为更多三角形”的,它只是映射某些属性,但都是从3D点映射到3D点 – Guiroux 2015-03-03 16:20:27
是否要刻录或限制立方体? – Guiroux 2015-03-03 12:14:24
不,我只想改变几何形状 – 2015-03-03 12:16:11
那么它很简单,你只是将每个点“归一化”为一个向量,而不是1的常态,而是预期的半径的规范 – Guiroux 2015-03-03 12:20:04