如何围绕屏幕中心旋转等距相机?
How do I rotate an isometric camera around the screen center?
我有一个基于图块的项目游戏,使用多个图块层获得了不错的伪 3d 效果,但我希望能够旋转相机(本质上是旋转精灵)。
但是,简单地旋转精灵不等于旋转世界,对吧?
据此,我必须:
x = (x - y) * (tile_width/2);
y = (x + y) * (tile_width/2);
但是,看到了吗?这只适用于 45 度旋转的瓷砖!我如何修改这些公式中使用的角度(或者可能是更好、更合适的角度)?
旋转精灵只是旋转 world/camera 的一部分。
要旋转world/camera,每个方块需要沿弧线移动,同时旋转。为此,您需要使用极坐标。计算从 center-of-rotation 到每个图块中心的距离和角度。然后将所需的 angle-of-rotation 添加到每个图块的极角。通过转换回笛卡尔坐标计算图块中心的新 x
和 y
值。
假设每个图块都由一个结构表示,并且该结构具有图块中心的原始 x
和 y
坐标(即世界未旋转时图块中心的坐标)。
// 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 度的示例 counter-clockwise。
以下是一些可能出错的示例:
1) 移动方块而不旋转方块
2) 旋转方块而不移动方块
3) 移动方块的同时顺时针旋转方块counter-clockwise
底线:几乎任何错误都会导致图像出现间隙。
我有一个基于图块的项目游戏,使用多个图块层获得了不错的伪 3d 效果,但我希望能够旋转相机(本质上是旋转精灵)。
但是,简单地旋转精灵不等于旋转世界,对吧?
据此,我必须:
x = (x - y) * (tile_width/2);
y = (x + y) * (tile_width/2);
但是,看到了吗?这只适用于 45 度旋转的瓷砖!我如何修改这些公式中使用的角度(或者可能是更好、更合适的角度)?
旋转精灵只是旋转 world/camera 的一部分。
要旋转world/camera,每个方块需要沿弧线移动,同时旋转。为此,您需要使用极坐标。计算从 center-of-rotation 到每个图块中心的距离和角度。然后将所需的 angle-of-rotation 添加到每个图块的极角。通过转换回笛卡尔坐标计算图块中心的新 x
和 y
值。
假设每个图块都由一个结构表示,并且该结构具有图块中心的原始 x
和 y
坐标(即世界未旋转时图块中心的坐标)。
// 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 度的示例 counter-clockwise。
以下是一些可能出错的示例:
1) 移动方块而不旋转方块
2) 旋转方块而不移动方块
3) 移动方块的同时顺时针旋转方块counter-clockwise
底线:几乎任何错误都会导致图像出现间隙。