在D3D9中,如何找到网格中特定三角形的法向量?

In D3D9, how to find the normal vector of a specific triangle in a mesh?

我加载一个网格并使用 D3DXIntersect 函数找出我将要击中该网格的哪个三角形,接下来我需要知道该三角形的法向量以便我可以相应地对齐自己。 D3DXIntersect 让我知道距离、三角形的面索引和一些 u 和 v 浮点坐标。有了这些信息,是否有任何方法可以获取或计算该三角形的法线?

这是我用来查找有关该三角形的信息的代码(目前我只是返回距离):

void hit_distance(vector3 origen, vector3 direccion)
{
    D3DXVECTOR3 origen_b(float(origen.x), float(origen.y), float(origen.z) );
    D3DXVECTOR3 direccion_b(float(direccion.x), float(direccion.y), float(direccion.z));
    BOOL hit = false;
    DWORD faceIndex = -1;
    float u = 0.0f;
    float v = 0.0f;
    float dist = 0.0f;
    ID3DXBuffer* allhits = 0;
    DWORD numHits = 0;
    D3DXIntersect(esfera_de_180, &origen_b, &direccion_b, &hit, &faceIndex, &u, &v, &dist, &allhits, &numHits);
    SAFE_RELEASE(allhits);
    if (hit)
    {
        distancia_mesh = dist;
    }
}

是的,这是可能的,但有点费力。

通过返回的faceIndex,你可以在相应的indexbuffer中查找三角形的三个索引,你可以将其解析为vertexbuffer中的顶点。这些包含计算法线所需的所有信息。通过使用位置的面法线或通过使用重心坐标 u 和 v 插值顶点法线的真实法线。

要检索索引和顶点缓冲区,您可以使用网格的相应方法 (Docs)