组合网格的向量的x,y,z值等于零

时间:2019-07-02 11:35:07

标签: c# unity3d

我正在尝试合并两个网格。我的代码如下所示。 CombineInstance'combine'在其顶点具有正确的值。但是,组合网格'RetMesh'的所有顶点均等于(0,0,0)。我不明白我在做什么错。

我已经阅读了在互联网上找到的教程,但我不知道自己在做什么错。

void Start () {
    Mesh MM2 = testmeshfunc();
    GameObject GO;
    GO = new GameObject("MeshFromMPC", typeof(MeshFilter), typeof(MeshRenderer));
    GO.gameObject.transform.localScale = new Vector3(1, 1, 1);

    GO.gameObject.GetComponent<MeshFilter>().mesh = MM2;
}

Mesh testmeshfunc()
{
    Mesh RetMesh = new Mesh();

    Vector3[] V3A = new Vector3[4];
    Vector3[] V3B = new Vector3[4];
    int[] TrPtsA = new int[6];
    int[] TrPtsB = new int[6];

    Mesh mesha = new Mesh();
    Mesh meshb = new Mesh();

    var combine = new CombineInstance[2];

    V3A[0] = new Vector3(0, 0, 0);
    V3A[1] = new Vector3(0, 1, 0);
    V3A[2] = new Vector3(1, 1, 0);
    V3A[3] = new Vector3(1, 0, 0);

    TrPtsA[0] = 0;
    TrPtsA[1] = 1;
    TrPtsA[2] = 2;
    TrPtsA[0] = 2;
    TrPtsA[1] = 1;
    TrPtsA[2] = 3;

    mesha.vertices = V3A;
    mesha.triangles = TrPtsA;

    V3B[0] = new Vector3(0, 0, 0);
    V3B[1] = new Vector3(0, 0, 1);
    V3B[2] = new Vector3(1, 0, 1);
    V3B[3] = new Vector3(1, 0, 0);

    TrPtsB[0] = 0;
    TrPtsB[1] = 1;
    TrPtsB[2] = 2;
    TrPtsB[0] = 2;
    TrPtsB[1] = 1;
    TrPtsB[2] = 3;

    meshb.vertices = V3B;
    meshb.triangles = TrPtsB;

    combine[0].mesh = mesha;
    combine[1].mesh = meshb;

    RetMesh.RecalculateBounds();
    RetMesh.RecalculateNormals();
    RetMesh.RecalculateTangents();

    RetMesh.CombineMeshes(combine);

    return RetMesh;
}

我正在使用Unity 2017。

1 个答案:

答案 0 :(得分:0)

首先,三角索引缓冲区设置错误。我虽然你在画飞机,但正面应该是顺时针方向,这是你的

        V3A[0] = new Vector3(0, 0, 0);
        V3A[1] = new Vector3(0, 1, 0);
        V3A[2] = new Vector3(1, 1, 0);
        V3A[3] = new Vector3(1, 0, 0);

        TrPtsA[0] = 0;
        TrPtsA[1] = 1;
        TrPtsA[2] = 2;
        TrPtsA[0] = 2;
        TrPtsA[1] = 1;
        TrPtsA[2] = 3;

        mesha.vertices = V3A;
        mesha.triangles = TrPtsA;


        V3B[0] = new Vector3(0, 0, 0);
        V3B[1] = new Vector3(0, 0, 1);
        V3B[2] = new Vector3(1, 0, 1);
        V3B[3] = new Vector3(1, 0, 0);


        TrPtsB[0] = 0;
        TrPtsB[1] = 1;
        TrPtsB[2] = 2;
        TrPtsB[0] = 2;
        TrPtsB[1] = 1;
        TrPtsB[2] = 3;

代码应该是这样的,我将索引缓冲区的方向更改为顺时针方向。如果您不顺时针旋转,则不会通过背面去除将其显示在屏幕上。

        V3A[0] = new Vector3(0, 0, 0);
        V3A[1] = new Vector3(0, 1, 0);
        V3A[2] = new Vector3(1, 1, 0);
        V3A[3] = new Vector3(1, 0, 0);

        TrPtsA[0] = 0;
        TrPtsA[1] = 1;
        TrPtsA[2] = 2;
        TrPtsA[0] = 2;
        TrPtsA[1] = 3;
        TrPtsA[2] = 1;

        mesha.vertices = V3A;
        mesha.triangles = TrPtsA;


        V3B[0] = new Vector3(0, 0, 0);
        V3B[1] = new Vector3(0, 0, 1);
        V3B[2] = new Vector3(1, 0, 1);
        V3B[3] = new Vector3(1, 0, 0);


        TrPtsB[0] = 0;
        TrPtsB[1] = 1;
        TrPtsB[2] = 2;
        TrPtsB[0] = 2;
        TrPtsB[1] = 3;
        TrPtsB[2] = 1;