如何在两个三维矢量之间进行翻转? 我将此方法用于2D向量:
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);
}
注意:这不完全是&#34;线性插值&#34 ;;这种方法将以恒定速率进行插值,这就是我想要的。
我想完全做到这一点,但为第三维添加了z组件。我怎么能这样做?
答案 0 :(得分:0)
最简单的方法是转换你的两个向量,使它们位于(u, v)
平面;然后应用上面的方法;然后转换回原始坐标空间。
这需要你构造一个旋转矩阵:
cross_1
; this
轴上的u
点; this
和cross_1
的叉积得到一个向量cross_2
,这是v
轴的方向。this_norm
,cross_2_norm
和cross_1_norm
。这三个向量可以写成3x3正交矩阵(每个向量是一个3元素列向量):
R = [ this_norm cross_2_norm cross_1_norm ]
现在:您可以将此三维矢量this
和other
乘以此矩阵,您将获得具有
[ u ]
[ v ]
[ 0 ]
即。一个三维列向量,零作为第三个元素(或者,至少,你应该。我可能忘记转置上面的3x3矩阵。)
因此,您显然可以丢弃第三个元素,并且具有2个元素的列向量:您可以将它们存储在Vector2d
中。因此,您可以应用上面的方法进行插值。
这会为您提供Vector2d
,该(u, v)
会在(x, y, z)
平面中进行插值。您可以通过将第三个元素附加到R'
空间并将其乘以R
(它是{{1}}的倒数,因为它是标准正交),将其转换回{{1}}空间。
当然,您需要处理退化情况,例如零和(反)并行向量。在这些情况下,一个或两个交叉产品为零,这意味着您无法将它们标准化;只需选择任意方向。
答案 1 :(得分:0)
如果我正确理解你的代码,当你计算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组件应该很简单。