Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Direct x创建球形网格?_C++_Directx_Mesh - Fatal编程技术网

C++ 使用Direct x创建球形网格?

C++ 使用Direct x创建球形网格?,c++,directx,mesh,C++,Directx,Mesh,如何在Direct-x中使用网格创建球体?我使用C++,程序只在Windows上运行。 当前所有内容都通过IDiRECT3DDEVICE9对象进行渲染。您可以使用该函数。创建球体的方法很多 一种是使用极坐标生成球体的切片 struct Vertex { float x, y, z; float nx, ny, nz; }; 考虑到该结构,您将按如下方式生成球体(我还没有对此进行测试,所以可能会有点错误) 然后对要细分的面的每条边的中点重复此过程 现在可以将每个面拆分为4个新的四

如何在Direct-x中使用网格创建球体?我使用C++,程序只在Windows上运行。
当前所有内容都通过IDiRECT3DDEVICE9对象进行渲染。

您可以使用该函数。

创建球体的方法很多

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

struct Vertex
{
    float x, y, z;
    float nx, ny, nz;
};
考虑到该结构,您将按如下方式生成球体(我还没有对此进行测试,所以可能会有点错误)

然后对要细分的面的每条边的中点重复此过程

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


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

我的答案应该很好,如果你需要帮助让它工作,请告诉我。太好了,我会检查这个:)现在投票赞成。我要到早上才能测试这段代码。如果我给你留言,如果这不起作用,你能回复吗?是的,每次我上车(这是经常的),我都会检查我留言的所有问题和答案,以获得回复。当然,你可以在我的回答上留下你的评论,我会自动得到通知。所以我已经这样做了,我觉得它是有效的(盲目的),但是,它不会有纹理,对吗?当一系列其他东西同时展出时,我什么也看不到。我可以给这个添加纹理吗?或者我如何确保它已正确显示?我不确定
D3DXCreateSphere
是否生成纹理坐标。这里有一个教程[1]演示了如何执行此操作。[1] 我想不管怎样,我都会遇到CreateSphere函数进入fail if语句的问题,不是吗?事实上,我认为如果它返回0,那么它就成功了。尝试使用失败的
宏。(或者:
如果(/*create sphere*/!=D3D_OK)
你是对的,我已经检查了HRESULT,它似乎已经成功了。不知道为什么它会进入那个循环。酷,谢谢!我会继续用它做我的研究:)对不起,这是我第一次做这种类型的编程。你在胡说很多我根本不懂的数学知识,你能不能详细说明一下?你想让我详细说明什么?
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++;
}
v.x = v.nx * sphereRadius;
v.y = v.ny * sphereRadius;
v.z = v.nz * sphereRadius;