沿二维任意方向的剪切(倾斜)变换

Shear (Skew) transformation along arbitrary direction in 2d

我需要在任意方向 (2d) 上倾斜二维多边形。在 X 轴上这样做看起来像这样:

   float skewAngle;
   glm::mat4 skewMatrix;
   skewMatrix[1][0] =  glm::tan(glm::radians(skewAngle));

Y-axis:

   skewMatrix[0][1] =  glm::tan(glm::radians(skewAngle));

我需要同时在 X 和 Y 方向倾斜,方向由 0 - 360 (-+) 之间的角度给出。在某些图形程序中,它也被称为 "Skew Axis"。我正在尝试这样的事情:

假设我想在 160 度给定的方向上倾斜形状。(零度 - 沿 X 轴剪切)

    float skewAxisAngle = 160.0f;  
    float skewAngle = glm::radians(skewAxisAngle);

然后我用 skewAngle 旋转我的单位方向矢量,它默认面向 x-axis。 glm::vec2 rotatedDirection = (glm::rotate(glm::vec2(1.0f, 0.0f), skewAngle));

标准化以始终保持在 [0-1] 范围内:

    rotatedDirection =  glm::normalize(rotatedDirection ) ;

然后我将方向作为权重分量明智地应用于 X 和 Y 偏斜:

 skewMatrix[1][0] = rotatedDirection.x * glm::tan(glm::radians(skewAngle));

 skewMatrix[0][1] = rotatedDirection.y * glm::tan(glm::radians(skewAngle));

结果似乎有效,但仅针对上述 angles.For 方形角,结果看起来不对。我的参考框架是 Adob​​e After Effects。

正确:

错误:

如果我理解你的需求是对的,那么请看书下面的公式(Nikulin Computer Geometry...)。 它描述了沿轴 (o,V) - 基点和方向向量的复杂倾斜变换。 T 是平移矩阵,R 带 tilda - 旋转矩阵。