剪切矩阵作为基本转换的组合?

时间:2013-08-21 15:47:02

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

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

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

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

4 个答案:

答案 0 :(得分:8)

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

(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)缩放。

答案 1 :(得分:5)

是的,可以完成,旋转后跟非均匀缩放和反向旋转。您可以在第三个问题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);

答案 2 :(得分: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

作为一个微不足道的重写,一把剪刀现在是两个剪刀和一个旋转。

但更重要的问题是:为什么你需要将剪切矩阵表示为其他东西?它已经是一个基本的矩阵形式,你在做什么样的计算环境,或者你想做什么,它需要你表达一个基本变换作为一种更复杂,更慢的计算方式? =)

答案 3 :(得分:1)

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

enter image description here

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

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

在Shear Matrix中,它们如下:

enter image description here

因为该矩阵中根本没有Rotation coefficients ,所以六个Shear coefficients和三个Scale coefficients可以使X旋转3D对象,YZ轴使用魔术三角法(sincos)。

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

enter image description here

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

enter image description here