npm package containing a business logic for coloring the jaws occlusion
npm install coloring-occlusion
intersecting occlusal surfaces of teeth
Перед использованием основной функции
необходимо подготовить геометрию мешей для более быстрого вычисления.
Это можно сделать с помощью функции prepareGeometry
:
import { BufferGeometry } from "three";
import { prepareGeometry } from "coloring-occlusion";
const modelGeometry: BufferGeometry = new BufferGeometry();
const geometry: BufferGeometry = prepareGeometry(modelGeometry);
Все вычисления происходят в функции intersectGeometries
. Для вызова функции
нужно подготовить информацию, которая будет подаваться, а конкретно intersectGeometriesInfo
,
которая содержит в себе:
-
firstJaw: Array<Mesh>
- первый массив мешей для пересечения -
secondJaw: Array<Mesh>
- второй массив -
intersectingVector: Vector3
- вектор, который будет рейкастить из первого массива геометрий во второй (не наоборот!) Важно обратить внимание на то, что если мы ищем пересечения из нижней челюсти в верхнюю (стреляем из первого массива во второй) , то необходимо указывать вектор который смотрит вниз. -
ranges: number[][]
- набор диапазонов которые необходимо указывать для разделения пересекающегося меша. Этот набор диапазонов должен быть:- Не пересекающимся
- Положительно рассположенным
- В объединении давать полный диапазон от минимальной до максимальной границы.
- Нижняя граница должна быть обязательна равна 0 (раз ищем пересечения)
- Верхняя граница должна быть гарантированно больше длины максимального пересечения (чтобы не появлялись пустоты в мешах пересечений), и одновременно не сильно большой, чтобы рейкастинг не был слишком долгим.
-
returningMeshes: boolean[]
- массив из двух элементов, возвращает только те меши пересечений, которые нужны. Т.е. еслиreturningMeshes = [true,false]
, то вернуться меши пересечений только для первой челюсти.
Примеры различных ranges
const ranges: number[][] = [
[0, 0.1],
[0.1, 0.3],
[0.3, 5],
];
const ranges: number[][] = [
[0, 0.1],
[0.1, 0.3],
[0.3, 0.5],
[0.5, 0.8],
[0.8, 5],
];
const ranges: number[][] = [
[0, 0.2],
[0.2, 5],
];
По итогу вызов основной функции intersectGeometries
может выглядить так:
const intersectingVector = new Vector3(0, 0, 1);
const ranges: number[][] = [
[0, 0.2],
[0.2, 5],
];
const returningMeshes = [true, true];
const info: intersectGeometriesInfo = {
firstJaw: upperJaw,
secondJaw: lowJaw,
intersectingVector,
ranges,
returningMeshes,
};
const result = intersectGeometries(info);
Результат состоит из
-
firstJaw
и/илиsecondJaw
- массив мешей пересечений, длина которого равнаranges
и которые расположены в том же порядке, что и диапазоны. -
maxIntersection
- длина максимально найденного пересечения, по заданному вектору. Важно отметить, что если длина реального максимального пересечения больше, чем верхняя граница вranges
, то вmaxIntersection
будет находиться направильный ответ