沿二维任意方向的剪切(倾斜)变换
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 方形角,结果看起来不对。我的参考框架是 Adobe After Effects。
正确:
错误:
如果我理解你的需求是对的,那么请看书下面的公式(Nikulin Computer Geometry...)。
它描述了沿轴 (o,V)
- 基点和方向向量的复杂倾斜变换。 T 是平移矩阵,R 带 tilda - 旋转矩阵。
我需要在任意方向 (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 方形角,结果看起来不对。我的参考框架是 Adobe After Effects。
正确:
错误:
如果我理解你的需求是对的,那么请看书下面的公式(Nikulin Computer Geometry...)。
它描述了沿轴 (o,V)
- 基点和方向向量的复杂倾斜变换。 T 是平移矩阵,R 带 tilda - 旋转矩阵。