基于Raylib的旋转矩形碰撞检测问题求助
解决Raylib中旋转矩形的碰撞检测问题
看起来你已经用RectanglePro成功渲染出旋转矩形了,但碰撞检测因为向量处理逻辑不对失效了——咱们一步步理清楚问题出在哪,以及怎么修复。
首先看你当前的代码行:
RotatedVector = Vector2Rotate(Vector2Normalize(Center), angle * DEG2RAD);
这里的核心问题是你对Vector2Normalize的用法完全错了:Vector2Normalize是把向量转换成单位长度(长度为1)的方向向量,但Center是矩形的中心坐标(比如相对于屏幕原点的位置),对它做归一化毫无意义——你真正需要旋转的,是矩形四个顶点相对于中心的偏移向量,而不是中心本身。
正确的旋转矩形顶点计算方式
要实现旋转矩形的碰撞检测,首先得算出旋转后矩形四个顶点的世界坐标,步骤如下:
- 先明确旋转矩形的核心属性:中心
Center、宽度width、高度height、旋转角度(转成弧度制的angleRad) - 定义四个顶点相对于中心的原始偏移(未旋转时的位置差):
- 左上角:
(-width/2, -height/2) - 右上角:
(width/2, -height/2) - 右下角:
(width/2, height/2) - 左下角:
(-width/2, height/2)
- 左上角:
- 对每个偏移向量用你提供的
Vector2Rotate函数做旋转 - 把旋转后的偏移向量加上中心坐标,得到世界空间里的真实顶点位置
示例代码如下:
// 定义旋转矩形的基础属性 Vector2 center = { 400, 300 }; float rectWidth = 100; float rectHeight = 50; float angleRad = angle * DEG2RAD; // angle是你原本的角度(度数) // 四个顶点相对于中心的原始偏移 Vector2 vertexOffsets[4] = { { -rectWidth/2, -rectHeight/2 }, // 左上 { rectWidth/2, -rectHeight/2 }, // 右上 { rectWidth/2, rectHeight/2 }, // 右下 { -rectWidth/2, rectHeight/2 } // 左下 }; // 计算旋转后的顶点世界坐标 Vector2 rotatedVertices[4]; for (int i = 0; i < 4; i++) { rotatedVertices[i] = Vector2Rotate(vertexOffsets[i], angleRad); rotatedVertices[i].x += center.x; rotatedVertices[i].y += center.y; }
实现碰撞检测
有了旋转后的顶点数组,就可以用Raylib自带的多边形碰撞函数处理检测了:
- 和另一个旋转矩形碰撞:用
CheckCollisionPolyPoly - 和点碰撞:用
CheckCollisionPointPoly - 和轴对齐矩形碰撞:把轴对齐矩形也转成4顶点的多边形,再用
CheckCollisionPolyPoly
举个检测旋转矩形和鼠标点碰撞的例子:
Vector2 mousePos = GetMousePosition(); bool isColliding = CheckCollisionPointPoly(mousePos, rotatedVertices, 4);
再说说你原代码的问题
你原代码里Vector2Normalize(Center)会把中心坐标转换成一个指向“原点到中心”方向的单位向量,旋转这个向量只会得到一个方向相同、长度为1的向量,完全无法代表矩形的顶点位置——这就是碰撞检测彻底失效的原因。
核心要区分位置向量和偏移向量:你需要旋转的是顶点相对于中心的偏移,而不是中心本身的位置。
内容的提问来源于stack exchange,提问作者Midnight Demise
相关产品推荐
相关产品推荐

