В Unity3D, что будет делать или устанавливать границы сетки? - PullRequest
2 голосов
/ 29 марта 2019

В кодовой базе 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;

Не беспокойтесьтам.Его длина составляет 4 см.

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

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

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

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

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

Какая здесь может быть модель / причина?

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

1 Ответ

2 голосов
/ 30 марта 2019

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

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

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

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

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

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

...