2

目前我正在处理以下问题。我正在使用 javascript,我不能(也不想)使用任何第三方 .js 库。

我正在编写一个函数,我在输入上有两个标准转换矩阵 - A 和 B:

var A = [
    [a, c, e],
    [b, d, f],
    [0, 0, 1]
];

var B = [
    [a, c, e],
    [b, d, f],
    [0, 0, 1]
];

以及介于或等于 0 和 1 之间的 theta 值 T。数字 a、b、c、d 对应于旋转和缩放,而 e 和 f 等于 x 和 y 位置。

我需要在这两个矩阵之间进行插值,我想知道,什么是最好的方法(性能方面),因为这个函数会经常被调用。我已经使用 lerp 整理了 x 和 y 部分。现在我想知道什么是最不密集的方法来做到这一点。这些是我到目前为止找到的选项:

  • 第一个选项 - 使用四元数和 slerp - 从我在网上找到并从我的同事那里听到的信息,这个选项涉及大量计算。我对这种方法也不是很熟悉,也不知道如何实现它以适应这种情况。
  • 第二个选项 - 分解这两个矩阵,获取 A 和 B 的平移、旋转和缩放值并存储它们,然后通过 T 处理这些并计算结果矩阵。

有没有其他方法可以减少我错过的 CPU 密集度?

4

1 回答 1

0

如果我没看错,您将获得 2D 变换:


(a,b)X轴方向向量
(c,d)Y轴方向向量
(e,f)是原点位置

所以让我们在从到插值t的范围内定义标量参数。t=<0.0,1.0>A(a0,b0,...)B(a1,b1,...)

位置可以直接插值:

e(t)=e0+(e1-e0)*t
f(t)=f0+(f1-f0)*t

现在方向向量有角度ax,ay和大小sx,sy

ax = atan2(b,a)
ay = atan2(d,c)
sx = sqrt(a^2 + b^2)
sy = sqrt(c^2 + d^2)

所以你可以插值:

ax(t)=ax0+(ax1-ax0)*t
ay(t)=ay0+(ay1-ay0)*t
sx(t)=sx0+(sx1-sx0)*t
sy(t)=sy0+(sy1-sy0)*t

并构造矩阵:

a=sx*cos(ax)
b=sx*sin(ax)
c=sy*cos(ay)
d=sy*sin(ay)

这应该够了吧 ...

有关更多信息,请参阅:

于 2019-12-13T09:21:59.283 回答