【问题标题】:Shear Matrix as a combination of basic transformation?剪切矩阵作为基本变换的组合?
【发布时间】:2018-09-30 08:38:28
【问题描述】:

我知道旋转、缩放、平移等的变换矩阵。我也知道剪切变换的矩阵。现在,我需要剪切矩阵--

[1 Sx 0]
[0 1  0]
[0 0  1]

以上述其他变换的组合形式。尝试搜索,尝试头脑风暴,但无法罢工!谢谢!

【问题讨论】:

  • 平移和缩放对剪切没有影响,因为它们对矩阵的不同元素进行操作。一个旋转可以由 3 个剪刀组成,但我没有听说过反过来做。你能改写一下这个问题吗?为什么需要这个矩阵由其他变换组成?另外,一旦你组合了最终的矩阵,你就无法知道它最初是如何组合的,因为许多不同的组合都会导致这个结果,那么你需要这个的情况是什么?

标签: matrix graphics linear-algebra transformation rotational-matrices


【解决方案1】:

剪切角theta的 x-shear 操作减少为旋转和缩放为 如下:

(a) 逆时针旋转theta/2

(b) 使用x-scaling factor = sin(theta/2)y-scaling factor = cos(theta/2) 进行缩放。

(c) 顺时针旋转45 degree

(d) 使用 x-scaling factor = sqrt(2)/sin(theta)y-scaling factor= sqrt(2) 进行缩放。

【讨论】:

  • 你是怎么想出这个程序的?
【解决方案2】:

是的,它可以做到,旋转后是非均匀缩放和反向旋转。您可以在第三个问题http://www.cs.cmu.edu/~djames/15-462/Fall03/assts/15-462-Fall03-wrAssign1-answer.pdf 中找到详细信息。您也可以尝试以下 openGL 代码。它将矩形旋转 45 度,然后在 x 轴上缩放。然后旋转 -26 度,即 atan(0.5)。 0.5 来自于在 x 方向缩放后找到 x 轴与一侧之间的角度。

glRotatef(-26.0, 0.0, 0.0, 1.0);

glScalef(2,1,1);

glRotatef(45.0, 0.0, 0.0, 1.0);

glRectf(0, 0, 25.0, 25.0);

【讨论】:

    【解决方案3】:

    在 3D 图形中,我们经常使用包含 16 个有用元素的 4x4 矩阵。身份4x4 矩阵如下:

    在这 16 个元素之间有 6 个不同的剪切系数:

    shear XY
    shear XZ
    shear YX
    shear YZ
    shear ZX
    shear ZY
    

    在剪切矩阵中它们如下:

    因为在此矩阵中根本没有Rotation coefficients,所以六个Shear coefficients 和三个Scale coefficients 允许您围绕XY 和@987654339 旋转3D 对象@ 轴使用神奇的三角函数(sincos)。

    下面是一个示例,如何使用 Shear 和 Scale 元素围绕其 Z 轴旋转 3D 对象 (CCW):

    使用剪切和缩放元素查看 3 种不同的旋转模式:

    【讨论】:

      【解决方案4】:

      剪切是一种基本的矩阵运算,因此虽然您可以将它们表示为“其他矩阵运算的组合”,但这样做真的很奇怪。剪刀有两种形式:

      | 1 V |    | 1 0 |
      | 0 1 | ,  | V 1 |
      

      而旋转矩阵涉及更多;使用旋转来表达剪切的想法表明你实际上还没有写出这些东西来看看你需要什么,所以让我们看看这个。旋转矩阵的形式为:

      | cos -sin |
      | sin  cos |
      

      可以由三个特定剪切矩阵的序列组成,R = Sx x Sy x Sx:

      | cos(a) -sin(a) |   |     1      0 |   | 1  sin(a) |   |     1      0 |
      |                | = |              | x |           | x |              |
      | sin(a)  cos(a) |   | -tan(a/2)  1 |   | 0    1    |   | -tan(a/2)  1 |
      

      现在,我们可以做一些简单的矩阵操作来得到 Sy。第一个左乘:

            R = Sx x Sy x Sx
      Sx⁻¹ x R = Sx⁻¹ x Sy x Sx
      Sx⁻¹ x R = I x Sy x Sx
      Sx⁻¹ x R = Sy x Sx
      

      然后右乘:

      Sx⁻¹ x R x Sx⁻¹ = Sy x Sx x Sx⁻¹
      Sx⁻¹ x R x Sx⁻¹ = Sy x I
      Sx⁻¹ x R x Sx⁻¹ = Sy
      

      作为一个简单的重写,一个剪切现在是两个剪切和一个旋转。

      但更重要的问题是:为什么需要将剪切矩阵表示为其他东西?它已经是一个初等矩阵形式,你在什么奇怪的计算环境中,或者你想做什么疯狂的事情,这需要你将初等变换表达为一种更复杂、更慢的计算方式? =)

      【讨论】:

      • 超出主题,您的意见应补充操作员问题的答案(在本例中存在)。第二次猜测应该在 cmets 恕我直言
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多