我们中的许多人都熟悉在给定角度 theta
的情况下围绕原点旋转 2D vector 的方法:
newX = x * cos(theta) - y * sin(theta);
newY = x * sin(theta) + y * cos(theta);
我现在尝试在图像 UV 空间中旋转坐标,它看起来像这样:
(图片借自 this SO 问题。)
这里 u
轴的单位比 v
轴的单位宽,所以上面的方法导致坐标围绕椭圆而不是圆形旋转.我需要 vector 的旋转,就像坐标是正方形一样,这意味着需要考虑纵横比。我认为这就像将坐标拉伸(stretch)到正方形空间一样简单,旋转,然后向后拉伸(stretch),尽管看起来 vector 仍然在椭圆旋转:
newX = (x * cos(theta) * Aspect - y * sin(theta)) / Aspect;
newY = x * sin(theta) * Aspect + y * cos(theta);
感谢任何帮助,提前致谢!
最佳答案
旋转和纵横比的一般版本是:
(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
希望对您有所帮助。
关于c++ - 以纵横比旋转二维 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52141572/