Как проецировать лицо объекта на плоскость? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть функция «выбрать грань объекта и выровнять его по плоскости». Как я могу сделать выбранную грань объекта равной плоскости?

У меня уже есть радиопередача к объекту с помощью щелчка мыши, выбора граней. У меня есть intersects.faces. Я пытался спроецировать эти векторы на плоскость, нормальную (то есть (0,0,1)), но безуспешно. Я пытаюсь вычислить кватернионы с помощью setFromUnitVectors, но это не работает должным образом.

var face = intersects[0].face;
var obj = intersects[0].object;
var geom = obj.geometry;
var newGeo = new Geometry().fromBufferGeometry( geom );

var vertA = newGeo.vertices[face.a];
var vertB = newGeo.vertices[face.b];
var vertC = newGeo.vertices[face.c];

let projectedVertA = vertA.clone().projectOnPlane(window.planeGround.position.normalize());
let projectedVertB = vertB.clone().projectOnPlane(window.planeGround.position.normalize());
let projectedVertC = vertC.clone().projectOnPlane(window.planeGround.position.normalize());

var quaternion = new Quaternion();
quaternion.setFromUnitVectors(vertA.clone().normalize(), projectedVertA);
obj.applyQuaternion(quaternion);
quaternion.setFromUnitVectors(vertB.clone().normalize(), projectedVertB);
obj.applyQuaternion(quaternion);
quaternion.setFromUnitVectors(vertC.clone().normalize(), projectedVertC);
obj.applyQuaternion(quaternion);

newGeo.verticesNeedUpdate = true;
let newBufferGeo = new BufferGeometry().fromGeometry( newGeo );
obj.geometry = newBufferGeo;

Я ожидаю, что объект будет вращаться, чтобы выбранная грань была параллельна плоскости. Но он не работает должным образом.

1 Ответ

1 голос
/ 28 июня 2019

Вы должны иметь дело не с позициями, а с нормалями. Единственный кватернион, который вы хотите:

quaternion.setFromUnitVectors(faceNormal, planeNormal);

Полагаю, вы знаете самолет в норме. Может быть, даже лицо нормальное. Если у вас его нет, вы можете рассчитать его из (псевдокод, а не код Three.js):

faceNormal = normalize((vertB - vertA) x (vertC - vertA))
...