自定义C++ 2D游戏引擎:相机旋转下精灵屏幕坐标转换异常
自定义C++ 2D游戏引擎坐标转换异常问题
开发背景与已验证功能
- 从零搭建自定义C++ 2D游戏引擎,仅使用SFML完成系统调用、屏幕绘制、输入采集能力,不依赖SFML的内置渲染与坐标转换链路
- 已确认正常运行的逻辑:
- 相机上下平移场景下,精灵世界坐标转屏幕坐标的计算结果正确
- 大部分场景中,叠加相机旋转的精灵坐标转换效果符合预期
核心异常表现
- 触发条件:渲染对象的世界空间y坐标高于相机的y坐标时
- 异常现象:精灵出现沿x轴翻转的渲染错误
- 验证排除项:注释掉相机旋转相关的坐标转换代码后,异常不会复现
触发异常的旋转转换逻辑代码
// 精灵位置已预先完成相对于相机位置的偏移计算 Vector2 screenCenter(windowWidth / 2, windowHeight / 2); Vector2 shapePosition = shape->GetPosition(); // 计算屏幕中心到精灵位置的相对向量 Vector2 relativeVector = shapePosition - screenCenter; float distance = relativeVector.Magnitude(); if (distance == 0) { return; } // 计算相对向量与x轴正方向的夹角(弧度) float angle = Vector2::AngleInRads(Vector2(1, 0), relativeVector); // 将相机的旋转角度转换为弧度值 float targetRotation = camera.GetFollowTarget()->GetTransform().GetRotation() * (M_PI / 180); // 叠加相机旋转角度得到调整后的总旋转角 float adjustedRotation = angle + targetRotation; // 将旋转角转换为单位向量 Vector2 newPos(cos(adjustedRotation), sin(adjustedRotation)); // 按照原相对距离缩放单位向量 newPos *= distance; // 将坐标原点重置回屏幕中心 newPos += screenCenter; shape->SetPosition(newPos);
异常复现的对照场景
- 统一视觉参考基准:蓝色方块代表相机焦点,紫色圆点对应世界坐标(0,0),世界空间内的箭头为垂直向上指向状态
- 各场景运行状态:
- 相机位于世界坐标原点时:渲染效果正常
- 相机位于箭头中点位置时:渲染效果正常
- 相机位于箭头上方位置时:渲染效果正常
- 相机位于箭头下方位置时:触发异常,箭头渲染错误
内容的提问来源于stack exchange,提问作者gBrandt
相关产品推荐
相关产品推荐

