两个旋转矩阵之间的插值

时间:2017-11-13 10:44:27

标签: javascript math matrix graphics interpolation

目前我处理以下问题。我正在使用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.数字a,b,c,d对应于旋转和缩放,e和f等于x和y位置。

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

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

有没有其他方法可能会减少我可以使用的CPU密集度,我错过了?

1 个答案:

答案 0 :(得分:0)

如果我看对的话,您将获得2D变换:


Option Explicit Function IsFileValid(ByVal strFileName As String) As Boolean Dim wb As Workbook Application.ScreenUpdating = False Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & strFileName, True, True) On Error Resume Next If Worksheets(wrkshtTracker).ListObjects(tableTracker).Range(1, 2) = strEmailHeader Then IsFileValid = True End If wb.Close False Set wb = Nothing On Error GoTo 0 Application.ScreenUpdating = True End Function X 轴方向向量
(a,b) Y 轴方向向量
(c,d)是原点位置

因此让我们在从(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

这应该可以解决问题...

有关更多信息,请参见: