我实现了“选择对象的面并将其与平面对齐”功能。如何使对象的选定面与平面平行?
我已经通过单击鼠标,选择面部向对象发出光线。我有相交。我确实尝试投影这些平面法线向量(即(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;
我希望对象将旋转以被选择,并且面将与平面平行。但是它不能正常工作。
答案 0 :(得分:1)
您不应处理职位,而应处理常态。您想要的一个四元数是:
quaternion.setFromUnitVectors(faceNormal, planeNormal);
我认为您知道飞机正常。甚至脸色正常。如果没有这个,可以从(伪代码,而不是three.js代码)中计算出来:
faceNormal = normalize((vertB - vertA) x (vertC - vertA))