使用Direct x创建球形网格?

2 c++ directx mesh

你如何在Direct-x中创建一个带网格的球体?我正在使用C++,程序将仅在Windows上运行.

目前所有东西都是通过IDiRECT3DDEVICE9对象渲染的.

GMa*_*ckG 6

你可以使用这个D3DXCreateSphere功能.


Goz*_*Goz 6

有很多方法可以创建一个球体.

一种是使用极坐标来生成球体的切片.

struct Vertex
{
    float x, y, z;
    float nx, ny, nz;
};
Run Code Online (Sandbox Code Playgroud)

鉴于结构你将生成球体如下(我没有测试过,所以我可能有点错误).

std::vector< Vertex > verts;
int count   = 0;
while( count < numSlices )
{
    const float phi = M_PI / numSlices;
    int count2  = 0;
    while( count2 < numSegments )
    {
        const float theta   =  M_2PI / numSegments
        const float xzRadius = fabsf( sphereRadius * cosf( phi ) );

        Vertex v;
        v.x = xzRadius * cosf( theta );
        v.y = sphereRadius * sinf( phi );
        v.z = xzRadius * sinf( theta );

        const float fRcpLen = 1.0f / sqrtf( (v.x * v.x) + (v.y * v.y) + (v.z * v.z) );
        v.nx    = v.x * fRcpLen;
        v.ny    = v.y * fRcpLen;
        v.nz    = v.z * fRcpLen;

            verts.push_back( v );
        count2++;
    }
    count++;
}
Run Code Online (Sandbox Code Playgroud)

这就是D3DXCreateSphere我相信的方式.当然,上面的代码并没有形成面孔,但如果你把它放在心上,这不是一个特别复杂的代码:)

另一方面,在我看来更有趣的方式是通过表面细分.

如果您从一个具有与上述代码相同的法线定义的多维数据集开始,您可以递归细分每一侧.基本上你找到了脸的中心.生成从中心到新点的矢量.将其标准化.将vert推出到球体的半径,如下所示(假设vn*是标准化法线):

v.x = v.nx * sphereRadius;
v.y = v.ny * sphereRadius;
v.z = v.nz * sphereRadius;
Run Code Online (Sandbox Code Playgroud)

然后,对要细分的面的每个边缘的中点重复此过程.

现在,您可以将每个面分成4个新的四边形面.然后,您可以将每个四边形细分为4个新的四边形,依此类推,直到达到所需的细化级别.

就个人而言,我发现这个过程在球体上提供了比第一种方法更好的顶点分布.