【发布时间】:2015-05-04 06:32:11
【问题描述】:
我有一个对象需要能够围绕其中心旋转,但要保持相同的原点(用于设置位置等)。所以,我想我需要使用Transform.
代码是用 Java (JSFML) 编写的,但我认为语法相似,任何熟悉 SFML 的人都能理解。
public class DoorTile extends Tile {
private Transform t;
public DoorTile() {
...
t = new Transform();
...
sprite.setTexture(TileTextures.DOORTEXTURE);
}
public void rotateAroundCenter(float degrees) {
Vector2f center = SpriteUtils.getTextureCenter(TileTextures.DOORTEXTURE);
t = Transform.rotate(t, degrees, center.x, center.y);
}
@Override
public void draw(RenderTarget rt, RenderStates states) {
RenderStates newStates = new RenderStates(Transform.combine(t, states.transform));
sprite.draw(rt, newStates);
}
getTextureCenter(Texture t) 返回t 的中心坐标。
现在,当我应用这种旋转时,我的精灵有一个奇怪的行为。起初,以 45 度作为测试,它们完全从屏幕上消失了。所以然后我尝试了1度。受影响的精灵似乎被“切断”并向下平移。 这是一张图片,使用 1 度作为参数:
对于上下文,我正在尝试旋转那些白色精灵(将是“门”),以便它们正确地适合走廊。例如。在垂直 cooridors 上是水平的,在水平走廊上是垂直的。 (精灵的白色部分是透明的占位符,仅用于调试目的。)
我应该怎么做才能使它正常工作?也就是说,我怎么能:
- 围绕其中心旋转精灵
- 保留原始原点(左上角)
【问题讨论】:
-
每次你绕着自己旋转一个物体时,一定要撤消它的平移,即它的位置。无论它们在旋转时的位置在哪里,当您应用旋转时它们将在哪里旋转。因此,要围绕其中心原点旋转对象,您必须将该对象移动其宽度和高度的一半,使其超过世界坐标 0,0。