我正在使用threejs,并且通过两组THREE.Vector3
的4个顶点定义了2个矩形。计算来自2组点的仿射变换
如何计算将第一个矩形转换为第二个矩形的仿射变换?
我想通过.applyMatrix(matrix)
将计算的仿射变换应用到第3个矩形。
解决:
/**
* Transform a THREE.CSS3DObject object so that it aligns to a given rectangle.
*
* @param object: A THREE.CSS3DObject object.
* @param v: A list of the 4 vertices of the rectangle (clockwise order) on which to align the object.
*/
function alignObject(object, v) {
// width of DOM object wrapped via CSS3DObject
var width = parseInt(object.element.style.width, 10);
// compute rect vectors from rect vertices
var v10 = v[1].clone().sub(v[0]);
var v30 = v[3].clone().sub(v[0]);
// compute (uniform) scaling
var scale = v10.length()/width;
// compute translation/new mid-point
var position = new THREE.Vector3().addVectors(v10, v30).multiplyScalar(0.5).add(v[0]);
// compute rotations
var rotX = -v30.angleTo(new THREE.Vector3(0, -1, 0));
// FIXME: rotY, rotZ
// apply transformation
object.scale.set(scale, scale, scale);
object.position = position;
object.rotateX(rotX);
}
我已经更新了我想要实现的草图的问题。至少在这种情况下,应该有唯一的仿射变换M.第一个矩形位于XY平面,原点中点,平行于X/Y的轴。第二个矩形被统一缩放,但任意翻译和旋转。这种情况是否有封闭的解决方案? – oberstet
@oberstet编辑一些假设 – MBo
感谢您的回答。是的,改变矢量基础。但我需要实际的转换M与三个一起使用。与此同时,我已经发现了它(请参阅更新后的问题)。不管怎么说,还是要谢谢你! – oberstet