【问题标题】:Computing affine transformation from 2 sets of points从 2 组点计算仿射变换
【发布时间】:2018-01-23 17:21:34
【问题描述】:

我正在使用 threejs,并通过两组 THREE.Vector3 定义了 2 个矩形,每组有 4 个顶点。

如何计算将第一个矩形转换为第二个矩形的仿射变换?

我想通过.applyMatrix(matrix) 将计算出的仿射变换应用于第三个矩形。

已解决:

/**
 * 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);
}

【问题讨论】:

    标签: javascript 3d geometry three.js


    【解决方案1】:

    我也在寻找同样的东西。发现这个: https://github.com/epistemex/transformation-matrix-js

    还没有尝试过,但是 fromTriangles() 函数看起来很有希望。

    Matrix.fromTriangles( t1, t2 ); // returns matrix needed to produce t2 from t1

    编辑:哎呀,我以为我将其发布为评论。变成了答案。哦,好吧..

    【讨论】:

    【解决方案2】:

    有计算仿射矩阵的方法,例如这里的2D情况:Affine transformation algorithm。但是要在 3D 中找到唯一的仿射变换,您需要 4 个非共面点(对于 2d - 3 个非共线点也是如此)。 4个共面点(您的矩形顶点)的M矩阵是奇异的,没有逆矩阵,上述方法不适用。

    二维情况的歧义示例:点 B、C、D 共线。一些仿射变换将它们移动到 B、E、F 点。但是有无数个匹配的仿射变换。其中两个将 A 点转换为 G 或 H 点。

    对于有限类的仿射变换存在一些解决方案。例如 - 你的第三个矩形总是在 XY 平面上吗? 如果这是真的,那么转换后的矩形将与第二个矩形位于同一平面上,您的问题会变得更简单 - 您需要计算从 (V1,V2,V3) 到 (V1', V2', V3')。让我们矢量A = V2-V1, B = V3-V1, A' = V2'-V1', B' = V3'-V1'。 XY平面上的每个点P(例如第三个矩形顶点)都是线性组合P = V1 + t * A + u * B,它是新平面P' = V1' + t * A' + u * B'的变换图像。在这种情况下不难找到 t,u 系数:t=(P.x - V1.x)/(V2.x-V1.x) u=(P.y - V1.y)/(V2.y-V1.y)

    【讨论】:

    • 我已经用我想要达到的目标的草图更新了这个问题。至少在这种情况下应该有一个唯一的仿射变换 M。第一个矩形在 XY 平面中,原点的中点,平行于 X/Y 的轴。第二个矩形是统一缩放的,但可以任意平移和旋转。这种情况有封闭的解决方案吗?
    • @oberstet 编辑了一些假设
    • 感谢您的回答。是的,改变向量基础。但我需要实际的转换 M 与三个一起使用。与此同时,我已经弄清楚了(请参阅更新的问题)。还是谢谢!
    猜你喜欢
    • 2014-05-22
    • 2020-01-03
    • 2018-04-09
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多