VoxelMeshSdf
Подписано дистанционное поле сетки как воксель.
Подписано дистанционное поле сетки как воксель.
Этот ресурс может быть использован для того, чтобы испечь сетку в подписанное поле дистанции (SDF). Данные хранятся как внутренний воксельный буфер. Затем они могут использоваться как форма или щетка в операциях на основе вокселя.
Примечание: Если вы можете, предпочтите использовать процедурные формы (например, сферу или коробку) для повышения качества и эффективности. VoxelMeshSdf Она является более дорогостоящей и в настоящее время имеет более низкое качество по сравнению с процедурными эквивалентами.
Примечание 2: не все печься.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
VoxelMeshSdfКонструктор
public VoxelMeshSdf();Свойства7
BakeModeСвойство
public VoxelMeshSdf.BakeModeEnum BakeMode { get; set; }Выберите алгоритм, который будет использован для вычисления SDF из сетки.
BoundarySignFixEnabledСвойство
public bool BoundarySignFixEnabled { get; set; }Некоторые алгоритмы не могут правильно рассчитать признаки расстояния сами по себе. Обычно за пределами формы есть положительный знак, а внутри формы - отрицательный знак. Ошибка может привести к тому, что неправильный знак "откажется" и распространится за пределами формы. Этот вариант пытается исправить это, если исходить из предположения о том, что граница пекущегося района всегда снаружи, и распространяет позитивные сигналы внутри, чтобы исключить утечку негативных знаков.
CellCountСвойство
public int CellCount { get; set; }Контроль за разрешением выпечки SDF пропорционально одной стороне трехмерного воксельного буфера. Более высокое качество, но медленнее печь и использует больше памяти.
MarginRatioСвойство
public float MarginRatio { get; set; }Контроль за дополнительным пространством вокруг печки в сети. Для улавливания внешних градиентов должны быть предусмотрены соответствующие буферы SDF. Это имущество добавляет наценку, основанную на соотношении размера сетки. Например, если сетка имеет ширину в 100 единиц, то разница в 0,1 добавит к ней 10 дополнительных единиц пространства.
MeshСвойство
public Mesh Mesh { get; set; }Mesh который будет печься, когда он позвонит VoxelMeshSdf.Bake функции, или при нажатии кнопки Бэйк в редакторе.
Возвращение этой свойства в пустоту не стирает печёный результат, так что вам не нужно, чтобы оригинальная сетка была загружена, чтобы использовать SDF.
PartitionSubdivСвойство
public int PartitionSubdiv { get; set; }Контроль за количеством подразделов, которые будут использоваться в зоне выпечки при использовании VoxelMeshSdf.BakeModeEnum.AccuratePartitioned и VoxelMeshSdf.BakeModeEnum.ApproxFloodfill Режимы.
При использовании VoxelMeshSdf.BakeModeEnum.AccuratePartitioned, это значение может быть пропорционально отрегулировано на основе количества треугольников, имеющихся в сети, из-за несовершенства алгоритма. Если сетка имеет несколько треугольников, то более низкие значения будут работать лучше. Если она имеет много маленьких треугольников, то более высокие значения будут работать лучше. Однако, если треугольники большие или немногочисленные и значение большие, это также потенциально создаст артефакты.
_DataСвойство
public Reckfell.Collections.Dictionary _Data { get; set; }Методы19
Bakevoid
public void Bake();Прикрепляет SDF к звонку с использованием назначенного в настоящее время VoxelMeshSdf.MeshЭто может затормозить игру, если она будет сделана на главной нити.
BakeAsyncvoid
public void BakeAsync(EntityTree sceneTree);Запитывает SDF на отдельной нитью с использованием назначенного в настоящее время VoxelMeshSdf.MeshСм. также VoxelMeshSdf.IsBaking, VoxelMeshSdf.IsBaked и VoxelMeshSdf.Baked.
| Имя | Тип | По умолчанию |
|---|---|---|
sceneTree | EntityTree | — |
DebugCheckSdfReckfell.Collections.Array
public Reckfell.Collections.Array DebugCheckSdf(Mesh mesh);Экспериментально. Проверяет, есть ли ошибки в выпечке SDF. Сетка должна быть сеткой, которая использовалась для выпечки. В случае ошибок в возвращаемом массиве будет содержаться информация о двух ячейках буфера, содержащая неправильные значения, в следующем формате:
[
cell0_position: Vector3,
cell0_triangle_v0: Vector3,
cell0_triangle_v1: Vector3,
cell0_triangle_v2: Vector3,
cell1_position: Vector3,
cell1_triangle_v0: Vector3,
cell1_triangle_v1: Vector3,
cell1_triangle_v2: Vector3,
]Если нет ошибок, возвращенный массив будет пустым. Этот метод является остаточным с момента первоначального внедрения этого ресурса в качестве попытки автоматизировать проверки при отладке. Ошибки могут не всегда указывать на непригодность SDF в зависимости от варианта использования. Он может быть удален или изменен в будущем.
| Имя | Тип | По умолчанию |
|---|---|---|
mesh | Mesh | — |
Reckfell.Collections.ArrayGetAabbAabb
public Aabb GetAabb();Найдите ограничивающую коробку печёной формы. Она может быть немного больше, чем оригинальная сетка. AABB из-за VoxelMeshSdf.MarginRatio - свойство.
AabbGetBakeModeVoxelMeshSdf.BakeModeEnum
public VoxelMeshSdf.BakeModeEnum GetBakeMode();VoxelMeshSdf.BakeModeEnumGetCellCountint
public int GetCellCount();intGetMarginRatiofloat
public float GetMarginRatio();floatGetMeshMesh
public Mesh GetMesh();MeshGetPartitionSubdivint
public int GetPartitionSubdiv();intGetVoxelBufferVoxelBuffer
public VoxelBuffer GetVoxelBuffer();Возьми VoxelBuffer Результаты будут храниться в канале SDF.
Этот буфер не следует модифицировать.
VoxelBufferIsBakedbool
public bool IsBaked();Получает, содержит ли ресурс данные SDF в выпечке.
boolIsBakingbool
public bool IsBaking();Получается, что асинхронная операция по выпечке еще не закончена.
boolIsBoundarySignFixEnabledbool
public bool IsBoundarySignFixEnabled();boolSetBakeModevoid
public void SetBakeMode(VoxelMeshSdf.BakeModeEnum mode);| Имя | Тип | По умолчанию |
|---|---|---|
mode | VoxelMeshSdf.BakeModeEnum | — |
SetBoundarySignFixEnabledvoid
public void SetBoundarySignFixEnabled(bool enable);| Имя | Тип | По умолчанию |
|---|---|---|
enable | bool | — |
SetCellCountvoid
public void SetCellCount(int cellCount);| Имя | Тип | По умолчанию |
|---|---|---|
cellCount | int | — |
SetMarginRatiovoid
public void SetMarginRatio(float ratio);| Имя | Тип | По умолчанию |
|---|---|---|
ratio | float | — |
SetMeshvoid
public void SetMesh(Mesh mesh);| Имя | Тип | По умолчанию |
|---|---|---|
mesh | Mesh | — |
SetPartitionSubdivvoid
public void SetPartitionSubdiv(int subdiv);| Имя | Тип | По умолчанию |
|---|---|---|
subdiv | int | — |
Сигналы и события1
BakedСобытие
public event Action Baked;Приемлемо, когда асинхронное пекание завершено.
VoxelMeshSdf.BakeModeEnum
| Значение | Описание |
|---|---|
AccurateNaive = 0 | Проверяет каждый треугольник из каждой клетки для определения ближайших расстояний. Он пытается быть точным, но гораздо медленнее других способов. Сетка должна быть закрыта, иначе SDF будет содержать ошибки. Знаки рассчитываются путем получения ближайшего треугольника и проверки того, какая сторона треугольника находится в центре клетки. |
AccuratePartitioned = 1 | Как и наивный метод, но разделяет пространство на перегородки, чтобы легче пропустить треугольники, которые не нуждаются в проверке. Быстрее, чем наивный метод, но все же относительно медленно. |
ApproxFloodfill = 3 | Приблизляет SDF к нему, вычисляя тонкий "корпус" точных значений вблизи треугольников, затем распространяет эти значения с помощью 26-ступенчатого наливного фильтра. Знаки рассчитываются только на начальном корпусе с помощью нескольких лучей из центра каждой клетки: если луч попадает в спину, то предполагается, что ячейка находится внутри. В противном случае предполагается, что она находится снаружи. Знаки распространяются как часть затопления. Хотя технически это не так, в настоящее время это самый быстрый метод и результаты зачастую достаточно хороши. |
ApproxInterp = 2 | Экспериментальный метод подвода пространства в 4x4x4, и пропуск вычислений SDF путем интерполяции 8 углов, если в этих клетках нет треугольников. Быстрее, чем наивный, но не очень интересный. Может быть удален. |
Count = 4 | Сколько есть способов выпечки. |