Что в Unity3D можно сделать или достичь, установив границы сетки?

В базе кода Unity я видел это:

// the game object currently has no mesh attached
MeshFilter mFilter = gameObject.AddComponent<MeshFilter>();
gameObject.AddComponent<MeshRenderer>();
// no problem so far
mFilter.mesh = MakeASmallQuadMesh(0.1f);
// great stuff
mFilter.mesh.bounds = SomeSpecificBounds();
// what ?

Функция "MakeASmallQuadMesh" имеет обычный вполне нормальный код для создания меша, поэтому

Mesh mesh = new Mesh();
mesh.SetVertices(verts);
mesh.SetIndices(indices);
mesh.SetUVs(0, uvs);
mesh.RecalculateNormals();
mesh.RecalculateBounds();
return mesh;

Не беспокойтесь. Получается квадрат диаметром 10 см.

Но как насчет строки кода

mFilter.mesh.bounds = SomeSpecificBounds();
  1. Я был поражен, узнав, что вы можете установить mesh.bounds, я предполагал, что он будет доступен только для чтения.

  2. Какой возможный «смысл» в «установке» границ? Это было бы примерно так: в кабинете врача есть письменные измерения, в которых говорится, что Джейн 6 футов. Вы меняете запись на 5 футов 10 дюймов. Конечно, рост Джейн совсем не меняется. Вы просто странным образом ошиблись в записи.

  3. Может быть так: границы меша используются разными, а то и многими системами Unity. (Отбраковка и т. д.) Может ли шаблон быть таким, что, «принуждая» границы, подобные этому (границы теперь «совершенно неверны» для объекта - это просто какое-то значение, которое вы вставили туда) программист хотел (для некоторых причина) Система Unity (скажем, отбраковка) для использования этих принудительных, бессмысленных (по отношению к фактическому объекту) значений?

  4. Дикое предположение, может быть, есть шаблон (я никогда не слышал), где вы «заставляете» границы объекта A быть такими же, как у объекта B - по какой-то причине я не могу догадаться?

Что может быть закономерностью/причиной здесь?

Я бы просто предположил, что это основная ошибка, но предположения убивают.


person Fattie    schedule 29.03.2019    source источник
comment
Здесь тоже дикая догадка, поэтому я не уверен, но, возможно, установка границ приведет к масштабированию объекта в соответствии с этими границами. Например, мне нужен автомобиль gameObject, и я хочу, чтобы он идеально помещался на парковочном месте, поэтому я установил в качестве границ длину парковки...   -  person Jonas Grumann    schedule 29.03.2019
comment
привет @JonasGrumann! Действительно, НЕТ, это абсолютно не так. (Действительно, это типичная ошибка, когда опытные программисты сначала делают что-то в единстве!) Границы очень сильно основаны только на сетке. Действительно, когда вы динамически создаете или изменяете сетку в коде, вы заканчиваете вызовом Unity RecalculateBounds, который правильно вычисляет и устанавливает границы; аналогично, когда Unity настраивает сетку из файла (например, вашего слона или чего-то еще из Maya), Unity вызывает RecalculateBounds. Принудительная установка границ вообще не изменяет базовую сетку или объект. Это остается загадкой!   -  person Fattie    schedule 29.03.2019
comment
@JonasGrumann, возможно, вы дали ответ на вопрос. Программист ошибочно подумал, что это фактически изменит сетку или, возможно, масштабирует игровой объект .......... возможно, это все, что нужно. Хотя выглядит подозрительно.   -  person Fattie    schedule 29.03.2019
comment
Действительно... подозрительно   -  person Jonas Grumann    schedule 29.03.2019
comment
Тоже предположение, но я только что понял, что ваш пример кода касается квадроцикла. Поэтому, если вы будете использовать RecalculateBounds();, я ожидаю получить ограничительную рамку с высотой 0, так как сетка содержит только одну плоскую плоскость. Так что, возможно, в примере они просто хотели (по какой-то причине) иметь границы MinMax, отличные от 0. Также есть Expand и SetMinMax, которые, я думаю, говорят в пользу теории 3.   -  person derHugo    schedule 29.03.2019


Ответы (1)


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

Первое, что я хотел подтвердить, это то, что границы на самом деле были установлены автоматически. Элементарная проверка показала, что это действительно так: в частности, границы сетки автоматически пересчитываются каждый раз, когда вы устанавливаете свойство mesh.vertices. Вероятно, это объясняет, почему свойство представляет собой массив фиксированной длины, а не список. (забавное примечание: если вы попытаетесь назначить вторичные свойства, такие как координаты uv или нормали, для сетки перед назначением позиций вершин, Unity мягко придирается к вам о несоответствующих длинах массивов, прежде чем сразу же взорваться. Так что не делайте этого.)

Что касается того, на что это на самом деле влияет, у меня было предчувствие: я установил границы моей сетки равными 0. Сразу же сетки в углу моего окна просмотра заявили, что они визуально отбраковываются. Это говорит нам о нескольких вещах:

  1. Установка границ явно имеет эффект.
  2. Unity действительно использует пользовательские данные границ.
  3. Unity использует границы сетки для отбраковки усеченной пирамиды.

Согласно руководству Unity, класс Bounds используется в трех случаях: Mesh.bounds, Renderer.bounds и Collider.bounds. Из этих трех свойств Mesh.bounds является единственным, доступным не только для чтения.

Что касается вопроса о том, зачем кому-то захотеть устанавливать границы сетки явно, не исключено, что вы могли бы выполнить какую-то умную оптимизацию отбраковки, например, посмотреть на сложную сетку через окно или что-то в этом роде, но если бы я предположить, кто бы ни написал этот код, не доверял Unity точно или явно устанавливать границы сетки.

person VPellen    schedule 30.03.2019
comment
новый пользователь VPellen, я ТАК РАД, что вы присоединились и написали пост! Спасибо! Исследуя все, что вы сказали сейчас ........ - person Fattie; 30.03.2019