如何在Direct-x中创建带网格的球体?我正在使用C ++,程序只能在Windows上运行。
目前所有内容都是通过IDiRECT3DDEVICE9对象呈现的。
答案 0 :(得分:6)
您可以使用D3DXCreateSphere
功能。
答案 1 :(得分:5)
有很多方法可以创建一个球体。
一种是使用极坐标生成球体切片。
struct Vertex
{
float x, y, z;
float nx, ny, nz;
};
鉴于结构你生成球体如下(我没有测试过,所以我可能有点错误)。
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++;
}
这就是D3DXCreateSphere我相信的方式。当然上面的代码并没有形成面孔,但如果你把它放在心上,这不是一个特别复杂的代码:)
另一方面,在我看来更有趣的方式是通过表面细分。
如果您从一个具有与上述代码相同的法线定义的多维数据集开始,您可以递归细分每一侧。基本上你找到了脸的中心。生成从中心到新点的矢量。将其标准化。将顶点推出到球体的半径,如下所示(假设v.n *是标准化法线):
v.x = v.nx * sphereRadius;
v.y = v.ny * sphereRadius;
v.z = v.nz * sphereRadius;
然后,对于要细分的面的每个边缘的中点重复此过程。
现在您可以将每张脸分成4个新的四边形脸。然后,您可以将每个四边形细分为4个新的四边形,依此类推,直到达到所需的细化级别。
我个人认为这个过程在球体上提供了比第一种方法更好的顶点分布。