首页 > 解决方案 > 使用 DirectX 11 制作椭圆

问题描述

if(shapeType == ELLIPSE)
    {
        Vertex* v = new Vertex[31];
        v[0] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
        float theta;

        for(int i = 1; i < 30; ++i)
        {
            theta = (MATH::TWO_PI * i) / static_cast<float>(30);
            v[i] = { cos(theta * i), sin(theta * i), 1.0f, 0.0f, 0.0f };
        }


        HRESULT hr = this->vertexBuffer.Initialize(this->device, v,31);
        if (FAILED(hr))
        {
            ErrorLogger::Log(hr, "Failed to create vertex buffer.");
            return false;
        }

        DWORD* indices = new DWORD[90];

        int indiceHelperNum1 = 1;
        int indiceHelperNum2 = 2;

        for(int i = 0; i < 87; i += 3)
        {
            indices[i] = 0;
            indices[i + 1] = indiceHelperNum1;
            indices[i + 2] = indiceHelperNum2;

            indiceHelperNum1++;
            indiceHelperNum2++;
        }

        indices[84] = 0;
        indices[85] = 29;
        indices[86] = 1;

        hr = this->indexBuffer.Initialize(this->device, indices, 90);
        if (FAILED(hr))
        {
            ErrorLogger::Log(hr, "Failed to create indices buffer.");
            return false;
        }

        delete[] v;
        delete[] indices;
    }

这是我的代码,我认为除了内存分配之外没有任何问题。但是,当我尝试此代码时,它不起作用。我想制作一个半径为 1 的圆,其中心为原点。我使用顶点选择点,并使用索引制作三角形。请告诉我我的代码是否有问题。

标签: game-enginedirectx-11ellipse

解决方案


这段代码有几个问题。

主要问题在以下行

v[i] = { cos(theta * i), sin(theta * i), 1.0f, 0.0f, 0.0f };

没有理由将theta乘以i

解决该问题后,您应该会看到类似的内容。 在此处输入图像描述

请注意图像右侧概述的问题区域。

为了缩小差距,需要修改最后 3 个索引。代替

indices[84] = 0;
indices[85] = 29;
indices[86] = 1;

indices[87] = 0;
indices[88] = 30;
indices[89] = 1;

最后一件事,是填充顶点的 for 循环没有填充索引 30 处的最后一个顶点。像这样调整 for 循环范围

for (int i = 1; i < 31; ++i)
{
    theta = (MATH::TWO_PI * i) / static_cast<float>(30);
    v[i] = { cos(theta ), sin(theta ), 1.0f, 0.0f, 0.0f };
}

最后,您应该会看到类似这样的内容。 在此处输入图像描述


推荐阅读