2016-03-21 114 views
0

我写了一个函数,可以从Unity3d中的网格中获取三角形,但是我得到一个“数组超出范围”的错误。这是功能:Unity3D:数组超出范围

static Vector3[,] CreateTriangles(Mesh _mesh) 
{ 
    // In this function I make an 2d array and then I store the triangles in there. 
    int TTriangleAmount = _mesh.triangles.Length/3; 
    int TTrianglePoints = _mesh.triangles.Length; 
    int TTriangleSize = 3; 
    Vector3[,] TTriangleArray = new Vector3[TTriangleAmount,TTriangleSize]; 

    for(int i = 0; i < TTrianglePoints ; i += TTriangleSize) 
    { 
     TTriangleArray[i,0] = _mesh.vertices[_mesh.triangles[i + 0]]; 
     TTriangleArray[i,1] = _mesh.vertices[_mesh.triangles[i + 1]]; 
     TTriangleArray[i,2] = _mesh.vertices[_mesh.triangles[i + 2]]; 
    } 
    return TTriangleArray; 
} 

我似乎无法找出它为什么超出范围。任何人都可以看到我犯的缺陷吗?

在此先感谢!

回答

1

发现问题!索引i每次增加3个。但是,我不能使用找到放置三角形的第一维的三角形阵列的位置。所以为了获得那个位置,我只是将i除以3以获得正确的位置并修复它!

using UnityEngine; 
using System.Collections; 

public class FetchTriangleTest : MonoBehaviour { 

    // Use this for initialization 
    void Start() { 

     Vector3[,] test = CreateTriangles(transform.GetComponent<MeshFilter>().mesh); 
    } 

    static Vector3[,] CreateTriangles(Mesh _mesh) 
    { 
     // In deze functie maak in een twee demensionale array waar ik de triangles in opsla. 
     int TTriangleAmount = _mesh.triangles.Length/3; 
     int TTrianglePoints = _mesh.triangles.Length; 
     int TTriangleSize = 3; 
     Vector3[,] TTriangleArray = new Vector3[TTriangleAmount,TTriangleSize]; 

     for(int i = 0; i < TTrianglePoints ; i += TTriangleSize) 
     { 
      int triIndex = i/3; 
      TTriangleArray[triIndex,0] = _mesh.vertices[_mesh.triangles[i + 0]]; 
      TTriangleArray[triIndex,1] = _mesh.vertices[_mesh.triangles[i + 1]]; 
      TTriangleArray[triIndex,2] = _mesh.vertices[_mesh.triangles[i + 2]]; 
     } 
     return TTriangleArray; 
    } 
} 
0

我会看到的第一件事是你的TTriangleAmount变量。看起来您有一个Vector3类型的二维数组,并且您将第一维的长度设置为TTriangleAmount。 TTriangleAmount看起来像是将三角形的数量设置为三分之一,所以如果您的三角形少于三个,您会得到0,如果网格中有三个三角形,则会得到1,依此类推。

您正在循环三角点,此时点的数量约为TTriangleAmount的三倍,所以您可以摆脱TTriangleAmount的'/ 3'或者干脆离开完全使用它并使用TTrianglePoint设置Vector3数组中第一个维度的大小。