Как создать сетку из нормалей и uv в Unity?

Привет, у меня есть эти данные, поступающие из API, и я знаю, что это куб:

    {
  "position": {
    "itemSize": 3,
    "type": "Float32Array",
    "array": [
      0.5,
      0.5,
      0.5,
      0.5,
      0.5,
      -0.5,
      0.5,
      -0.5,
      0.5,
      0.5,
      -0.5,
      -0.5,
      -0.5,
      0.5,
      -0.5,
      -0.5,
      0.5,
      0.5,
      -0.5,
      -0.5,
      -0.5,
      -0.5,
      -0.5,
      0.5,
      -0.5,
      0.5,
      -0.5,
      0.5,
      0.5,
      -0.5,
      -0.5,
      0.5,
      0.5,
      0.5,
      0.5,
      0.5,
      -0.5,
      -0.5,
      0.5,
      0.5,
      -0.5,
      0.5,
      -0.5,
      -0.5,
      -0.5,
      0.5,
      -0.5,
      -0.5,
      -0.5,
      0.5,
      0.5,
      0.5,
      0.5,
      0.5,
      -0.5,
      -0.5,
      0.5,
      0.5,
      -0.5,
      0.5,
      0.5,
      0.5,
      -0.5,
      -0.5,
      0.5,
      -0.5,
      0.5,
      -0.5,
      -0.5,
      -0.5,
      -0.5,
      -0.5
    ],
    "normalized": false
  },
  "normal": {
    "itemSize": 3,
    "type": "Float32Array",
    "array": [
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      0,
      0,
      -1,
      0,
      0,
      -1,
      0,
      0,
      -1,
      0,
      0,
      -1,
      0,
      0,
      0,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      0,
      0,
      -1,
      0,
      0,
      -1,
      0,
      0,
      -1,
      0,
      0,
      -1,
      0,
      0,
      0,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      0,
      0,
      -1,
      0,
      0,
      -1,
      0,
      0,
      -1,
      0,
      0,
      -1
    ],
    "normalized": false
  },
  "uv": {
    "itemSize": 2,
    "type": "Float32Array",
    "array": [
      0,
      1,
      1,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      1,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      1,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      1,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      1,
      1,
      0,
      0,
      1,
      0,
      0,
      1,
      1,
      1,
      0,
      0,
      1,
      0
    ],
    "normalized": false
  }
}

Как мне теперь из этих данных создать куб и его материал в Unity? Есть ли библиотека или встроенная функция?


person Suisse    schedule 27.05.2020    source источник


Ответы (1)


Во-первых, для анализа ваших данных JSON в полезную структуру вам необходимо иметь соответствующую структуру класса и использовать, например. JsonUtility

[Serializable]
public class DataSet
{
    public int itemSize;
    public int[] array;
    public bool normalized;
}

[Serializable]
public class Example
{
    public DataSet position;
    public DataSet normal;
    public DataSet uv;
}

и делать

var data = JsonUtility.FromJson<Example>(yourJsonString);

Затем эти данные все еще довольно сырые, и нам нужно их проанализировать, так как нам нужны действительные векторные значения.

var vertices = new List<Vector3>();

for(var i = 0; i < data.position.array.Length; i+=3)
{
    if(i+2 > data.position.array.Length - 1) break;

    var x = data.position.array[i];
    var y = data.position.array[i+1];
    var z = data.position.array[i+2];
    vertices.Add(new Vector3(x,y,z));
}

И аналогично для нормалей и UV (только здесь вы используете Vector2 вместо этого)


Затем к основному вопросу: поскольку у вас уже есть позиции (я предполагаю вершины), нормали и UV, я думаю, вам интересно, откуда взять треугольники.

UV здесь совсем не помогают, так как они являются всего лишь координатами текстуры, определяющими, как текстура впоследствии накладывается на треугольники.

Да и нормальные здесь не помогут. Нормаль — это просто направление и не дает никакой полезной информации о том, какие три вершины вместе составляют треугольник.

Получить треугольники можно только в том случае, если вы знаете, например. что всегда 3 последовательные вершины составляют треугольник - это означает, что ваша сетка имеет повторяющиеся вершины.

В противном случае я бы сказал, что невозможно узнать эти треугольники из ваших данных.

В Unity треугольники — это просто плоские int[], где всегда три последовательных элемента являются индексами трех вершин из массива вершин.

Таким образом, при одном предположении, что они просто являются следствием чего-то вроде

var triangles = new int[vertices.Length]; 
for(var i = 0; i < triangles.Length; i++)
{
    triangles[i] = i;
}

Затем вы можете просто собрать все это вместе и создать сетку, например

var mesh = new Mesh();
mesh.vertices = vertices;
mesh.triangles = triangles;
// Etc
person derHugo    schedule 27.05.2020