【发布时间】:2019-12-12 19:23:58
【问题描述】:
生成渲染球体所需点的算法很少,但我找不到一个好的算法,也找不到一个完整的球体算法来为球体的一部分生成点。
假设我有最小/最大纬度、最小/最大经度和球体半径。如何生成能够渲染球体的这一部分的网格?
【问题讨论】:
生成渲染球体所需点的算法很少,但我找不到一个好的算法,也找不到一个完整的球体算法来为球体的一部分生成点。
假设我有最小/最大纬度、最小/最大经度和球体半径。如何生成能够渲染球体的这一部分的网格?
【问题讨论】:
我制作了半球和半球网格的一部分。我稍微编辑了 Songho Ahn 的源代码,您可以参考以下链接:
http://www.songho.ca/opengl/gl_sphere.html
class Sphere的主要方法是buildVertices*
你可以通过编辑这个方法得到想要的结果。
我做了这样的半球:
void HemiSphere::buildVerticesSmooth()
{
...
float sectorStep = 2 *PI / sectorCount;
float stackStep = (PI / 2) / stackCount;
float sectorAngle, stackAngle;
for(int i = 0; i <= stackCount; ++i)
{
stackAngle = -PI / 2 + i * stackStep; // starting from -pi/2 to 0
xy = radius * cosf(stackAngle); // r * cos(u)
z = radius *( 1 + sinf(stackAngle) ); // r * sin(u)
...
我还制作了半球体,切割了它的地板,这样它的底部就有了均匀的地板。为此,保持 x y 坐标不变,只需将 z 坐标编辑为 0。
void HemiSphere::buildVerticesSmooth()
{
....
float sectorStep = 2 *PI / sectorCount;
float stackStep = (PI / 2) / stackCount;
float sectorAngle, stackAngle;
float d = sqrt(radius*radius - flat_radius*flat_radius)/radius;
for(int i = 0; i <= stackCount; ++i)
{
stackAngle = -PI / 2 + i * stackStep; // starting from -pi/2 to 0
xy = radius * cosf(stackAngle); // r * cos(u)
z = radius *( d + sinf(stackAngle) ); // r * sin(u)
if (z<0.0) z = 0.0;
....
希望这会有所帮助。
【讨论】: