You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Raylib的旋转矩形碰撞检测问题求助

解决Raylib中旋转矩形的碰撞检测问题

看起来你已经用RectanglePro成功渲染出旋转矩形了,但碰撞检测因为向量处理逻辑不对失效了——咱们一步步理清楚问题出在哪,以及怎么修复。

首先看你当前的代码行:

RotatedVector = Vector2Rotate(Vector2Normalize(Center), angle * DEG2RAD);

这里的核心问题是你对Vector2Normalize的用法完全错了:Vector2Normalize是把向量转换成单位长度(长度为1)的方向向量,但Center是矩形的中心坐标(比如相对于屏幕原点的位置),对它做归一化毫无意义——你真正需要旋转的,是矩形四个顶点相对于中心的偏移向量,而不是中心本身。

正确的旋转矩形顶点计算方式

要实现旋转矩形的碰撞检测,首先得算出旋转后矩形四个顶点的世界坐标,步骤如下:

  1. 先明确旋转矩形的核心属性:中心Center、宽度width、高度height、旋转角度(转成弧度制的angleRad)
  2. 定义四个顶点相对于中心的原始偏移(未旋转时的位置差):
    • 左上角:(-width/2, -height/2)
    • 右上角:(width/2, -height/2)
    • 右下角:(width/2, height/2)
    • 左下角:(-width/2, height/2)
  3. 对每个偏移向量用你提供的Vector2Rotate函数做旋转
  4. 把旋转后的偏移向量加上中心坐标,得到世界空间里的真实顶点位置

示例代码如下:

// 定义旋转矩形的基础属性
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:02:25