旋转具有长宽比的2D矢量

时间:2018-09-02 22:57:17

标签: c++ vector rotation aspect-ratio

我们许多人都熟悉在给定角度theta的情况下围绕原点旋转2D向量的方法:

newX = x * cos(theta) - y * sin(theta);
newY = x * sin(theta) + y * cos(theta);

我现在正在尝试旋转图像UV空间中的坐标,如下所示:

UV Space

(图像是从this问题中借来的。)

此处u轴的单位宽于v轴的单位,因此上述方法导致坐标围绕椭圆而不是圆旋转。我需要向量的旋转来像座标一样摆正,这意味着需要考虑纵横比。我认为这就像将坐标拉伸到一个正方形空间,然后旋转,然后向后拉伸一样简单,尽管矢量似乎仍然是椭圆旋转的:

newX = (x * cos(theta) * Aspect - y * sin(theta)) / Aspect;
newY = x * sin(theta) * Aspect + y * cos(theta);

感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

旋转和长宽比的常规版本为:

(center_c,center_y)为旋转中心

(aspect_x,Aspect_y)是Aspect_ratio

tmp_x = (x-center_x)/aspect_x
tmp_y = (y-center_y)/aspect_y
tmp_x = tmp_x * cos(theta) - tmp_y * sin(theta)
tmp_x = tmp_x * sin(theta) + tmp_y * cos(theta)
new_x = aspect_x*tmp_x-center_x
new_y = aspect_y*tmp_x-center_y

希望有帮助。