Это не окончательное решение. Это всего лишь точка, из которой вы можете начать.
UPD: Here является продолжением этого ответа, как сформировать контуры из заданных точек.
Кроме того, это называется this SO question с удивительным anwers из WestLangley и Ли Stemkoski о .localToWorld()
методе THREE.Object3D()
.
Представим себе, что вы хотите найти точки пересечения обычной геометрии (например, THREE.DodecahedronGeometry()
).
Идея:
THREE.Plane()
имеет .intersectLine (line, optionalTarget)
метод
Сетка содержит лица (THREE.Face3()
)
Каждая грань имеет a, b, c
свойства, где индексов вершины хранятся.
Когда мы знаем, индексы вершин, мы можем получить их из массива vertices
Когда мы знаем координаты вершин грани, мы можем построить три THREE.Line3()
объекты
Когда мы имеем три линии, мы можем проверить, пересекает ли их плоскость.
Если у нас есть точка пересечения, мы можем сохранить его в массиве.
Повторите шаги 3 - 7 для каждой грани сетки
Некоторые объяснения с кодом:
У нас есть plane
, который THREE.PlaneGeometry()
и obj
которое THREE.DodecahedronGeometry()
Итак, давайте создать THREE.Plane()
:
var planePointA = new THREE.Vector3(),
planePointB = new THREE.Vector3(),
planePointC = new THREE.Vector3();
var mathPlane = new THREE.Plane();
plane.localToWorld(planePointA.copy(plane.geometry.vertices[plane.geometry.faces[0].a]));
plane.localToWorld(planePointB.copy(plane.geometry.vertices[plane.geometry.faces[0].b]));
plane.localToWorld(planePointC.copy(plane.geometry.vertices[plane.geometry.faces[0].c]));
mathPlane.setFromCoplanarPoints(planePointA, planePointB, planePointC);
Здесь три вершины любой грани plane
являются копланарными, поэтому мы можем создать из них mathPlane
, используя метод .setFromCoplanarPoints()
.
Тогда мы будем перебрать грани нашего obj
:
var a = new THREE.Vector3(),
b = new THREE.Vector3(),
c = new THREE.Vector3();
obj.geometry.faces.forEach(function(face) {
obj.localToWorld(a.copy(obj.geometry.vertices[face.a]));
obj.localToWorld(b.copy(obj.geometry.vertices[face.b]));
obj.localToWorld(c.copy(obj.geometry.vertices[face.c]));
lineAB = new THREE.Line3(a, b);
lineBC = new THREE.Line3(b, c);
lineCA = new THREE.Line3(c, a);
setPointOfIntersection(lineAB, mathPlane);
setPointOfIntersection(lineBC, mathPlane);
setPointOfIntersection(lineCA, mathPlane);
});
где
var pointsOfIntersection = new THREE.Geometry();
...
var pointOfIntersection = new THREE.Vector3();
и
function setPointOfIntersection(line, plane) {
pointOfIntersection = plane.intersectLine(line);
if (pointOfIntersection) {
pointsOfIntersection.vertices.push(pointOfIntersection.clone());
};
}
В конце концов, мы делаем наши точки видны:
var pointsMaterial = new THREE.PointsMaterial({
size: .5,
color: "yellow"
});
var points = new THREE.Points(pointsOfIntersection, pointsMaterial);
scene.add(points);
jsfiddle пример. Нажмите кнопку там, чтобы получить точки пересечения между плоскостью и додекаэдром.
Nice. Возможно также соединить точки ... https://jsfiddle.net/8uxw667m/4/ – WestLangley
@WestLangley Да, отлично! Я действительно забыл добавить такую очевидную визуальную вещь. Благодаря! – prisoner849
хорошее решение. Я подумал о том, как решить точку (пересекаемую точку) между двумя точками, теперь это, по-видимому, не требуется. –