【问题标题】:How to project face of object to plane?如何将物体的面投影到平面上?
【发布时间】:2019-11-10 13:20:21
【问题描述】:

我已经实现了“选择对象的面并将其与平面对齐”功能。如何使对象的选定面平行于平面?

我已经通过鼠标点击对物体进行光线投射,选择面。我有 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;

我期望对象将旋转以选择面将平行于平面。但它不能正常工作。

【问题讨论】:

  • quaternion.setFromUnitVectors(face.normal, planeNormal);

标签: math three.js transformation


【解决方案1】:

您不应该处理位置,而是处理法线。您想要的单个四元数是:

quaternion.setFromUnitVectors(faceNormal, planeNormal);

我假设你知道飞机正常。也许连脸都正常。如果没有这个,可以从(伪代码,不是three.js代码)计算:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2011-04-10
    • 2017-10-06
    相关资源
    最近更新 更多