Как создать Me sh из нормалей и uv в Unity? - PullRequest
1 голос
/ 27 мая 2020

Привет, у меня есть данные из 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? Есть библиотека или встроенная функция?

1 Ответ

0 голосов
/ 27 мая 2020

Во-первых, для разбора данных 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, я думаю, вам интересно, откуда брать треугольники.

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

Также нормали здесь не помогут. Нормаль - это просто направление и не дает никакой полезной информации о том, какие три вершины вместе составляют треугольник. треугольник - означает, что ваш me sh имеет повторяющиеся вершины.

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

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

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

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

Тогда вы можете просто собрать все вместе и создать меня sh как

var mesh = new Mesh();
mesh.vertices = vertices;
mesh.triangles = triangles;
// Etc
...