【问题标题】:3D Vector linear interpolation3D 矢量线性插值
【发布时间】:2023-03-22 20:45:01
【问题描述】:

如何在两个 3d 向量之间切换? 我将此方法用于二维向量:

public Vector2d lerp(Vector2d other, double speed, double error) {
    if (equals(other) || getDistanceSquared(other) <= error * error)
        return other;
    double dx = other.getX() - this.x, dy = other.getY() - this.y;
    double direction = Math.atan2(dy, dx);
    double x = this.x + (speed * Math.cos(direction));
    double y = this.y + (speed * Math.sin(direction));
    return new Vector2d(x, y);
}

注意:这不完全是“线性插值”;此方法将以恒定速率进行插值,这正是我想要的。

我想完全做到这一点,但为第三个维度添加了 z 组件。我该怎么做?

【问题讨论】:

    标签: java 3d trigonometry lerp


    【解决方案1】:

    最简单的方法是转换两个向量,使它们位于(u, v) 平面内;然后应用上面的方法;然后变换回原来的坐标空间。

    这需要你构造一个旋转矩阵:

    1. 取两个向量的叉积,得到相互法线向量;打电话给cross_1;
    2. 定义this 沿u 轴指向;
    3. 取this 和cross_1 的叉积,得到一个向量cross_2,也就是你的v 轴的方向。
    4. 对这三个向量中的每一个进行归一化;打电话给他们this_norm、cross_2_norm 和cross_1_norm。

    这三个向量可以写成一个 3x3 正交矩阵(每个向量都是一个 3 元素的列向量):

    R = [ this_norm cross_2_norm cross_1_norm ]
    

    现在:您可以将您的 3d 向量 this 和 other 乘以这个矩阵,您将得到具有以下形式的向量

    [  u  ]
    [  v  ]
    [  0  ]
    

    即一个以零作为第三个元素的 3 维列向量(或者,至少你应该这样做。我可能忘记转置上面的 3x3 矩阵)。

    因此,您显然可以丢弃第三个元素,并拥有 2 元素列向量:您可以将它们存储在 Vector2d 中。因此,您可以应用上面的方法进行插值。

    这会给你一个Vector2d,它在(u, v) 平面中进行插值。您可以将其转换回(x, y, z) 空间,方法是在其上附加零第三个元素,并预乘以R'(这是R 的倒数,因为它是正交的)。


    当然,您需要处理退化的情况,例如零和(反)平行向量。在这些情况下,一个或两个叉积为零,这意味着您无法对它们进行归一化;只需选择任意方向即可。

    【讨论】:

      【解决方案2】:

      如果我正确理解您的代码,当您计算 dx 和 dy 偏移量时,然后计算角度,最后计算 sin/cos 对 - 您基本上是在对 dx,dy 向量进行归一化,因此您可以这样编写:

      Vector2d delta = other - this;         // I'm not sure about your API here,
      delta.normalize();                     // you may need to fix those lines
      double x = this.x + (speed * delta.x);
      double y = this.y + (speed * delta.y);
      

      现在添加 Z 组件应该很简单了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-11
        • 2012-09-12
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多