TriangleMesh
CPU-структура треугольников с BVH для локальных ray/segment-запросов.
TriangleMesh — собственный RefCounted для поиска пересечений, не ArrayMesh для рисования и не физическое тело. CreateFromFaces принимает плоский массив Vector3 тройками, не индексный буфер. Строит свой BVH-снимок: изменения исходного меша/массива не обновляют его автоматически. Для собственного объекта используйте Dispose.
При построении позиции округляются snappedf(0.0001) и объединяются по округлённым координатам. GetFaces поэтому не обязан побитно совпадать с исходными float. Учитывайте единицы и масштаб: это не точное пересечение микрогеометрии любой величины.
IntersectRay задаётся началом и ненулевым направлением, IntersectSegment — началом и концом. Все точки должны быть в координатах BVH: Transform MeshInstance3D автоматически не применяется. Оба метода возвращают собственный Dictionary. Пустой словарь означает промах либо ещё не построенный BVH. При попадании ключи position (Vector3), normal (Vector3), face_index (int). Нормаль разворачивается против запроса, а не обязательно совпадает с исходным winding. Выберите результат по ключам после проверки Count и освободите словарь.
Возвращается ближайшее принятое пересечение, не все попадания, collider, UV или список поверхностей игрового мира. face_index относится к тройке текущего набора faces, не к Entity/material ID. Равные расстояния, вырожденные треугольники и точность на крайних масштабах этим обзором не приняты.
В общем наборе 34 headless-проверок протестированы новый пустой объект, построение, ближайший ray/segment, противоположная нормаль, копия GetFaces, span-перестроение и округление. Это CPU-проверка; графика и физический мир не запускались.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
TriangleMeshКонструктор
public TriangleMesh();Создаёт собственный RefCounted без валидного BVH. GetFaces и запросы до построения дают пустые результаты.
Методы5
CreateFromFaces2 перегрузки
public bool CreateFromFaces(Vector3[] faces);Заменяет BVH непустым flat-массивом Vector3 тройками. Позиции snapped к шагу 0.0001; одинаковые округлённые координаты объединяются. При некорректной длине диагностируется, valid сбрасывается: не рассчитывайте на сохранение старого валидного BVH. Array/span имеют одну семантику.
| Имя | Тип | По умолчанию |
|---|---|---|
faces | Vector3[] | — |
facesНепустой массив конечных Vector3 с длиной кратной 3; каждая тройка — треугольник. Не индексный список.
booltrue при валидном построенном BVH; false не гарантирует сохранение предыдущей структуры.
public bool CreateFromFaces(ReadOnlySpan<Vector3> faces);Заменяет BVH непустым flat-массивом Vector3 тройками. Позиции snapped к шагу 0.0001; одинаковые округлённые координаты объединяются. При некорректной длине диагностируется, valid сбрасывается: не рассчитывайте на сохранение старого валидного BVH. Array/span имеют одну семантику.
| Имя | Тип | По умолчанию |
|---|---|---|
faces | ReadOnlySpan<Vector3> | — |
facesНепустой массив конечных Vector3 с длиной кратной 3; каждая тройка — треугольник. Не индексный список.
booltrue при валидном построенном BVH; false не гарантирует сохранение предыдущей структуры.
GetFacesVector3[]
public Vector3[] GetFaces();Возвращает managed-копию треугольных углов текущего BVH в группах по три. Координаты уже округлены; изменение результата не меняет BVH. При отсутствии валидной структуры пусто.
Vector3[]Новый Vector3[] углов тройками либо пустой массив.
IntersectRayReckfell.Collections.Dictionary
public Reckfell.Collections.Dictionary IntersectRay(Vector3 begin, Vector3 dir);Ищет ближайшее принятое пересечение впереди begin вдоль ненулевого dir. Это бесконечный луч, не отрезок begin→dir. Нормаль результата направлена против запроса. Локальные координаты/снимок, без physics layers и автоматических Transform3D.
| Имя | Тип | По умолчанию |
|---|---|---|
begin | Vector3 | — |
dir | Vector3 | — |
beginНачало запроса в координатах BVH.
dirНенулевое направление луча, обычно нормализованное; не конечная точка.
Reckfell.Collections.DictionaryСобственный Dictionary: position, normal, face_index при попадании, иначе пусто. Освободите после использования.
IntersectSegmentReckfell.Collections.Dictionary
public Reckfell.Collections.Dictionary IntersectSegment(Vector3 begin, Vector3 end);Ищет ближайшее принятое пересечение конечного begin→end. Возвращает только одно попадание; нормаль развёрнута против движения. Не является contains/overlap-проверкой всего тела.
| Имя | Тип | По умолчанию |
|---|---|---|
begin | Vector3 | — |
end | Vector3 | — |
beginНачало запроса в координатах BVH.
endКонец отрезка в координатах BVH, не направление.
Reckfell.Collections.DictionaryСобственный Dictionary: position, normal, face_index при попадании, иначе пусто. Освободите после использования.