如何围绕屏幕中心旋转等距相机?

时间:2016-01-16 07:05:39

标签: python c rotation sdl isometric

我有一个基于图块的项目游戏,使用多个图块层获得了很好的伪3D效果,但我希望能够旋转相机(基本上是旋转精灵)。

但是,简单地旋转精灵并不等于旋转世界,对吗?

由此,我得到:

x = (x - y) * (tile_width/2);
y = (x + y) * (tile_width/2);

但是,看到了吗?这只适用于45度旋转瓷砖!如何修改这些公式中使用的角度(或者更好,更合适的角度)?

Plain Isometric

1 个答案:

答案 0 :(得分:3)

旋转精灵只是旋转世界/相机的一部分。

要旋转世界/相机,每个瓷砖需要沿弧线移动,并同时旋转。要做到这一点,你需要使用极坐标。计算从旋转中心到每个瓷砖中心的距离和角度。然后将所需的旋转角度添加到每个图块的极角。通过转换回笛卡尔坐标来计算切片中心的新xy值。

以下是代码的外观,假设每个tile都由一个struct表示,并且该struct具有tile中心的原始xy坐标(即坐标)当世界不旋转时,瓷砖的中心。)

    // compute the distance from the center of the tile to the center of rotation
    double dx = tile[t].x - centerOfRotation.x;
    double dy = tile[t].y - centerOfRotation.y;

    // compute the new location of tile in polar coordinates relative to the center of rotation
    double r = sqrt(dx*dx + dy*dy);
    double angle = atan2(dy, dx) + angleOfRotation;

    // compute the display location for the tile
    x = centerOfRotation.x + r * cos(angle);
    y = centerOfRotation.y + r * sin(angle);

    // note that the tile itself needs to rotated as well, using angleOfRotation
    // also, all angles are in radians

尝试旋转图形时,有助于简化操作。使用少量瓷砖,使瓷砖具有强烈边框的不同颜色,以及用于显示方向的识别标记。这是一个示例,在初始方向上有9个瓷砖,逆时针旋转30度。

enter image description here enter image description here

以下是一些可能出错的例子:
1)移动瓷砖而不旋转瓷砖
enter image description here
2)旋转瓷砖而不移动瓷砖
enter image description here
3)顺时针旋转瓷砖,同时逆时针移动瓷砖 enter image description here
底线:几乎任何错误都会导致图像有间隙。