【问题标题】:SFML - Rotating a sprite around its center using a TransformSFML - 使用变换围绕其中心旋转精灵
【发布时间】: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 上是水平的,在水平走廊上是垂直的。 (精灵的白色部分是透明的占位符,仅用于调试目的。)

我应该怎么做才能使它正常工作?也就是说,我怎么能:

  1. 围绕其中心旋转精灵
  2. 保留原始原点(左上角)

【问题讨论】:

  • 每次你绕着自己旋转一个物体时,一定要撤消它的平移,即它的位置。无论它们在旋转时的位置在哪里,当您应用旋转时它们将在哪里旋转。因此,要围绕其中心原点旋转对象,您必须将该对象移动其宽度和高度的一半,使其超过世界坐标 0,0。

标签: rotation sfml


【解决方案1】:

所以,问题在于,我没有考虑 Transform 处理其变换的方式(即从 (0, 0) 开始)。因此,即使我尝试围绕纹理中心旋转(在本例中为 16x16 纹理),它也会围绕 (8, 8) 旋转我的所有精灵,这就是为什么我的结果很奇怪。所以,我改变了我的绘制函数来考虑精灵的位置:

public void rotateAroundCenter(float degrees) {
    ending.vector.Vector2f center = SpriteUtils.getTextureCenter(TileTextures.DOORTEXTURE);
    ending.vector.Vector2f rotateOrigin = new ending.vector.Vector2f(sprite.getPosition()).add(center);
    transform = Transform.rotate(transform, degrees, rotateOrigin.x, rotateOrigin.y);
}

另外,我需要确保在旋转之前设置精灵的位置,因为 draw() 方法仍然会认为我在 (8, 8) 上旋转它们(因为精灵的默认位置是 (0, 0))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多