C++ SFML中图形绕指定原点旋转失效问题求助
C++ SFML中图形绕指定原点旋转失效问题求助
嘿,我来帮你排查这个旋转问题!
你现在遇到的核心问题是对SFML里setOrigin()方法的理解有点偏差——这个函数设置的是图形自身局部坐标系的锚点,而不是世界坐标系中的某个位置。你当前给setOrigin()传的Vector2f(-187.5f, -375),对于尺寸为275x25的矩形来说,这个锚点完全在图形的外部(而且距离非常远),所以旋转的时候看起来就像是绕窗口的(0,0)在转,本质是绕这个你设置的“远锚点”在转。
正确的思路
在SFML里:
setOrigin(x,y):x和y是相对于图形自身的坐标,比如矩形默认锚点是左上角(0,0),如果想绕中心旋转,就应该设为(宽度/2, 高度/2);如果想绕右下角旋转,就设为(宽度, 高度)。setPosition(x,y):是把这个锚点放到世界坐标系(窗口)中的对应位置。
修改后的代码示例
假设你想要让矩形绕自身中心旋转,调整后的代码应该是这样的:
int main() { RenderWindow window(VideoMode(375, 475), ""); RectangleShape sprite(Vector2f(275, 25)); // 设置原点为矩形自身的中心 sprite.setOrigin(275/2.f, 25/2.f); sprite.setFillColor(Color::White); // 把矩形中心放到窗口的中间位置(你可以根据需求改这个坐标) sprite.setPosition(window.getSize().x/2.f, window.getSize().y/2.f); while (window.isOpen()) { Event event; while (window.pollEvent(event)) { if (event.type == Event::Closed) window.close(); } window.clear(); sprite.rotate(0.01); // 现在会绕矩形中心正常旋转了 window.draw(sprite); window.display(); } return 0; }
如果你的需求不是绕中心,而是绕其他自定义的锚点,只需要调整setOrigin()的参数就行——记住这个参数是相对于矩形自身的,比如想绕矩形的左边缘中点旋转,就设(0, 25/2.f)。
备注:内容来源于stack exchange,提问作者Goose
相关产品推荐
相关产品推荐

