在2d中沿任意方向的剪切(Skew)变换

问题描述 投票:0回答:1

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

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

Y轴:

   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轴。 glm :: vec2 rotatingDirection =(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));

结果似乎有效,但仅适用于方角。对于像上面这样的角度,结果看起来不对。我的参考框架是Adobe After Effects。

正确:

enter image description here

错误:

enter image description here

math transform transformation skew
1个回答
1
投票

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.