我知道旋转,缩放,平移等的变换矩阵。我也知道剪切变换的矩阵。现在,我需要剪切矩阵 -
[1 Sx 0]
[0 1 0]
[0 0 1]
以其他上述转换的组合形式。尝试搜索,尝试头脑风暴,但无法罢工!谢谢!
答案 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
矩阵如下:
在这16个元素之间,有6个不同的剪切系数:
shear XY
shear XZ
shear YX
shear YZ
shear ZX
shear ZY
在Shear Matrix中,它们如下:
因为该矩阵中根本没有Rotation coefficients
,所以六个Shear coefficients
和三个Scale coefficients
可以使X
旋转3D对象,Y
和Z
轴使用魔术三角法(sin
和cos
)。
以下是使用Shear和Scale元素如何围绕其Z
轴旋转3D对象(CCW)的示例:
使用“剪切”和“缩放”元素查看3种不同的旋转模式: