在2d

时间:2018-02-20 23:25:41

标签: math transform transformation skew

我需要在任意方向(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

1 个答案:

答案 0 :(得分:1)

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

enter image description here