0

ついに何かが表示されました。graphics.GraphicsDevice.DrawIndexedPrimitivesの使用に切り替えました...次の問題...1つの三角形のみが表示されます。データセットは約200個の三角形です。入ってくるデータをフォーマットして、3つの連続するベクトルごとに三角形の面が形成されるようにしました。これらは不規則な形を形成する不規則な三角形です。頂点のインデックス付けを完全には理解していません。3つのインデックスがそれぞれ三角形を形成しているように見えます。もしそうなら、インデックスは入ってくるデータと一致します。私はこれをしました:

int i4 = -1;
        indices = new int[xData1.Count];
        for (int i2 = 0; i2 < xData1.Count; i2++)
        {
            i4++;
            cubeVertices[i4].Position = new Vector3((float)xData1[i2][0], (float)xData1[i2][1], (float)xData1[i2][2]);
            cubeVertices[i4].Color = Color.LawnGreen;
            indices[i4] = i4;
        }

インデックスを入力する頂点と一致させる..次に、Reimersの法線計算を使用して法線を提供しました。彼の例ではインデックスごとに6つの頂点を使用していたため、これはおそらく間違っています(私は思います!)。

for (int i = 0; i < cubeVertices.Length; i++)
            cubeVertices[i].Normal = new Vector3(0, 0, 0);

        for (int i = 0; i < indices.Length / 3; i++)
        {
            int index1 = indices[i * 3];
            int index2 = indices[i * 3 + 1];
            int index3 = indices[i * 3 + 2];

            Vector3 side1 = cubeVertices[index1].Position - cubeVertices[index3].Position;
            Vector3 side2 = cubeVertices[index1].Position - cubeVertices[index2].Position;
            Vector3 normal = Vector3.Cross(side1, side2);

            cubeVertices[index1].Normal += normal;
            cubeVertices[index2].Normal += normal;
            cubeVertices[index3].Normal += normal;
        }

        for (int i = 0; i < cubeVertices.Length; i++)
            cubeVertices[i].Normal.Normalize();

ここで修正する必要があるものはいくつありますか?私は数百の三角形のうち1つしか見ていません:(あなたの忍耐のためのthx

public struct VertexPositionColorNormal
    {
        public Vector3 Position;
        public Color Color;
        public Vector3 Normal;

        public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration
        (
            new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
            new VertexElement(sizeof(float) * 3, VertexElementFormat.Color, VertexElementUsage.Color, 0),
            new VertexElement(sizeof(float) * 3 + 4, VertexElementFormat.Vector3, VertexElementUsage.Normal, 0)
        );
    }

..。

private void CopyToBuffers()
    {
        vertexBuffer = new VertexBuffer(graphics.GraphicsDevice, VertexPositionColorNormal.VertexDeclaration, 
            cubeVertices.Length, BufferUsage.WriteOnly);
        vertexBuffer.SetData(cubeVertices);

        myIndexBuffer = new IndexBuffer(graphics.GraphicsDevice, typeof(int), indices.Length, BufferUsage.WriteOnly);
        myIndexBuffer.SetData(indices);
    }

...。

foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes)
        {
            basicEffect.World = world;
            basicEffect.View = view;
            basicEffect.Projection = proj;

            pass.Apply();

            graphics.GraphicsDevice.Indices = myIndexBuffer;
            graphics.GraphicsDevice.SetVertexBuffer(vertexBuffer);
            graphics.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
                cubeVertices.Length, 0, indices.Length / 3);
4

1 に答える 1

0

通常の計算は正しいです。間違っていたとしても、三角形が間違った稲妻を受け取るだけです。

入ってくる頂点の順序と正確に一致するインデックスを使用していますが、それ自体が冗長です。インデックスをまったく設定しないように切り替えて、DrawPrimitives代わりにプリミティブカウントを使用すると、違いはありますか?

それ以外に、提供しているデータが有効であると確信していますか? 頂点位置は正しく設定されていますか?

于 2012-08-03T12:19:47.917 に答える