c++ - 在 opengl 中将立方体转换为球体

标签 c++ opengl geometry normals

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

现在我想把这个立方体变成一个球体(也许,我只想有圆角)(稍后,我想为这个变换制作动画)。

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

最佳答案

要使用简单的 OpenGL 执行此操作,您需要使用更精细的立方体 segmentation 。不是只用两个三角形绘制每张脸,而是将其 segmentation 为更小的部分。最简单的曲面 segmentation 是将面分割成更小的正方形,然后用三角形条绘制它们。

如果您将每条边分成 n block ,您最终会得到 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 乘以半径。

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

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

关于c++ - 在 opengl 中将立方体转换为球体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28831424/

相关文章:

java - 确定多边形上线段的最佳起点和终点

c++ - 二维 vector 中元素的所有排列(笛卡尔积)

c++ - 这是我第一次编程,我无法运行我的代码

c - 从 glOrtho 切换到 gluPerspective

javascript - 圆内圆,但不在同一个 div 中分开(如飞镖游戏)

python - 在多维环中均匀采样,无排斥

c++ - 在 C++ 中,不允许将对象直接传递给函数吗?

c++ - Qt - QTcpserver 工作不正常

c++ - OpenGL 在 Z 缓冲区和深度测试方面遇到问题

Java OpenGL 将片段着色器应用于部分透明纹理映射四边形