npm package containing a business logic for coloring the jaws occlusion
npm install coloring-occlusion-v2npm package containing a business logic for coloring the jaws occlusion
``shell`
npm install coloring-occlusion
prepareGeometry:`typescript
import { BufferGeometry } from "three";
import { prepareGeometry } from "coloring-occlusion";const modelGeometry: BufferGeometry = new BufferGeometry();
const geometry: BufferGeometry = prepareGeometry(modelGeometry);
`
$3
Все вычисления происходят в функции intersectGeometries . Для вызова функции
нужно подготовить информацию, которая будет подаваться, а конкретно intersectGeometriesInfo,
которая содержит в себе: *
firstJaw: Array - первый массив мешей для пересечения
* secondJaw: Array - второй массив
* intersectingVector: Vector3 - вектор, который будет рейкастить из первого массива геометрий во второй (не наоборот!)
Важно обратить внимание на то, что если мы ищем пересечения из нижней челюсти в верхнюю (стреляем из первого массива во второй)
, то необходимо указывать вектор который смотрит вниз.
* ranges: number[][] - набор диапазонов которые необходимо указывать для разделения пересекающегося меша.
Этот набор диапазонов должен быть:
1. Не пересекающимся
2. Положительно рассположенным
3. В объединении давать полный диапазон от минимальной до максимальной границы.
4. Нижняя граница должна быть обязательна равна 0 (раз ищем пересечения)
5. Верхняя граница должна быть гарантированно больше длины максимального пересечения (чтобы не появлялись пустоты в мешах пересечений), и
одновременно не сильно большой, чтобы рейкастинг не был слишком долгим.
* returningMeshes: boolean[] - массив из двух элементов, возвращает только те меши пересечений,
которые нужны. Т.е. если returningMeshes = [true,false], то вернуться меши пересечений
только для первой челюсти.Примеры различных
ranges
`typescript
const ranges: number[][] = [
[0, 0.1],
[0.1, 0.3],
[0.3, 5],
];
`
!ranges1
`typescript
const ranges: number[][] = [
[0, 0.1],
[0.1, 0.3],
[0.3, 0.5],
[0.5, 0.8],
[0.8, 5],
];
`
!ranges2
`typescript
const ranges: number[][] = [
[0, 0.2],
[0.2, 5],
];
`
!ranges3По итогу вызов основной функции
intersectGeometries может выглядить так:
`typescript
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 будет находиться направильный ответ$3
Метод, который позволяет найти минимальное расстояние между двумя мешами по заданному единичному вектору.
Перед использованием необходимо сделать подготовку геометрий аналогичную для функции раскраски.Использование:
`typescript
const firstMesh: Mesh = new Mesh();
const secondMesh: Mesh = new Mesh();
const calcVector: Vector3 = new Vector3().normalize();const distance: number = getPairDistance(
firstMesh,
secondMesh,
calcVector
);
``В случае, если меши пересекаются, то полученное расстояние будет указывать на максимальное пересечение со знаком минус.
Пример реализации: minimal distance for two meshes