0

誰でも助けてください。

3DS Max で作成した立方体があります。立方体の寸法がわかりません。立方体の面の各三角形の頂点を取得する方法はありますか? 立方体の面の1つに法線を取得して、その向きを決定しようとしています。したがって、頂点を決定できれば、面の法線を取得できます。3 つの頂点 V1、V2、V3 が反時計回りに並べられている場合、(V2 - V1) x (V3) を計算することで法線の方向を取得できます。 - V1)、ここで x は 2 つのベクトルの外積です。

モデルの .fbx ファイルを調べたところ、いくつかの値が表示されています: Vertices: *24 { a: -15,-12.5,0,15,-12.5,0,-15,12.5,0,15, 12.5,0,-15,-12.5,0.5,15,-12.5,0.5,-15,12.5,0.5,15,12.5,0.5}

PolygonVertexIndex: *36 { a: 0,2,-4,3,1,-1,4,5,-8,7,6,-5,0,1,-6,5,4,-1,1 ,3,-8,7,5,-2,3,2,-7,6,7,-4,2,0,-5,4,6,-3}

これらは私のモデルの頂点ですか? また、Vertices: * 24は頂点のリストですが、なぜ 24 しかないのでしょうか? 立方体には 36 個の頂点があってはならないのですか? そして最後に、頂点の座標がPolygonVertexIndex の場合: * 36これらの値は、頭の中にある立方体がこれらの寸法であると想像すると、私にはずれているように見えますか?

または、各頂点のすべての値を手動で入力しなくても、立方体の頂点を自動的に取得する方法はありますか? 私はいくつかのモデルを持っているかもしれません

どんな助けでも大歓迎です

4

2 に答える 2

1

なぜそれが必要なのかわかりません...モデルをロードすると計算されるため、内部的に各頂点には法線があります...

とにかく計算しやすい...

最初の 3 つのインデックスは面の最初の三角形を定義し、次の 3 つのインデックスは面の他の三角形を定義します。

法線を計算するために必要な三角形は 1 つだけです...

したがって、3 つのインデックスを使用して Veretex 配列にアクセスし、3 つのポイントを取得します... A、B、および C

これで、法線は、その頂点で形成された 2 つのベクトル間のクロス積の結果です。

 Vector3 Normal = Vector3.Cross(B-A, C-B);

法線が戻るか進むかは、A、B、C の順序に依存する場合、CounterClockWise または ClockWise にすることができますが、モデルのすべての三角形は一方向に並べられます。だからあなたはそれを試して修正する必要があります

于 2012-04-24T12:50:32.477 に答える
0

手間をかけずに法線を読み取る XNA プログラムを作成できます。

ただし、それでも計算したい場合は、FFWD から取得したこの C# コードをガイドとして使用してください。長所と短所の詳細については、URL を確認してください。個人的にはあまり満足のいく結果ではありませんが、とりあえずはうまくいきました。もちろん、このコードは FFWD 関連 (Unity の XNA 用 API の実装) であるため、XNA と完全には一致しませんが、数学は同じままです。

    /// <summary>
    /// Recalculates the normals.
    /// Implementation adapted from http://devmaster.net/forums/topic/1065-calculating-normals-of-a-mesh/
    /// </summary>
    public void RecalculateNormals()
    {
        Vector3[] newNormals = new Vector3[_vertices.Length];

        // _triangles is a list of vertex indices,
        // with each triplet referencing the three vertices of the corresponding triangle
        for (int i = 0; i < _triangles.Length; i = i + 3)
        {
            Vector3[] v = new Vector3[]
            {
                _vertices[_triangles[i]],
                _vertices[_triangles[i + 1]],
                _vertices[_triangles[i + 2]]
            };

            Vector3 normal = Vector3.Cross(v[1] - v[0], v[2] - v[0]);

            for (int j = 0; j < 3; ++j)
            {
                Vector3 a = v[(j+1) % 3] - v[j];
                Vector3 b = v[(j+2) % 3] - v[j];
                float weight = (float)Math.Acos(Vector3.Dot(a, b) / (a.magnitude * b.magnitude));
                newNormals[_triangles[i + j]] += weight * normal;
            }
        }

        foreach (Vector3 normal in newNormals)
        {
            normal.Normalize();
        }

        normals = newNormals;
    }
于 2012-04-25T09:04:14.187 に答える