如何正确变换射线?射线需置于玩家方块前端的技术问询
解决方案
核心问题是射线起点应从玩家的前端位置(而非玩家原点)出发,同时保留原有正常的碰撞检测逻辑。以下是具体修改步骤:
1. 计算玩家前端的世界坐标
先定义玩家前端相对于自身中心的偏移距离(根据你的玩家方块尺寸调整,比如假设玩家方块边长为64,半长32,偏移量设为32),再基于玩家朝向计算前端的世界位置:
// 在射线循环前添加这段代码 float playerFrontOffset = 32.0f; // 替换为实际的前端偏移距离 vec2 forwardDir = {cos(playerAngle), sin(playerAngle)}; vec2 frontPos; glm_vec2_scale_add(playerPos, forwardDir, playerFrontOffset, frontPos);
2. 修改射线碰撞检测的初始起点
将射线碰撞逻辑中所有使用playerPos的地方替换为frontPos,确保射线从前端开始检测:
// 替换原有的rayX/rayY初始计算逻辑 if(rayAngle > glm_rad(180)) // 向下看 { rayY = (((int)frontPos[1] >> 6) << 6) - 0.0001f; rayX = (frontPos[1] - rayY) * aTan + frontPos[0]; yOffset = -mapSize; xOffset = -yOffset * aTan; } if(rayAngle < glm_rad(180)) // 向上看 { rayY = (((int)frontPos[1] >> 6) << 6) + mapSize; rayX = (frontPos[1] - rayY) * aTan + frontPos[0]; yOffset = mapSize; xOffset = -yOffset * aTan; } if(rayAngle == 0 || rayAngle == glm_rad(180)) { rayX = frontPos[0]; rayY = frontPos[1]; dof = maxDOF; }
3. 修改射线绘制的起点
将射线的起始顶点从玩家原点改为前端位置:
// 替换原有的rayVertices[0]赋值 rayVertices[0] = (Vertex){{frontPos[0], frontPos[1], 0.0f}, {1.0f, 1.0f, 1.0f, 1.0f}}; rayVertices[1] = (Vertex){{rayX, rayY, 0.0f}, {1.0f, 1.0f, 1.0f, 1.0f}};
4. 关于射线的变换矩阵
你的射线绘制逻辑无需额外添加旋转/平移变换,因为我们已经在世界坐标系中计算了正确的起点和终点。保持当前的rayTransform为单位矩阵即可,只要确保mvp矩阵使用和玩家一致的projectionMatrix与viewMatrix,就能保证射线和玩家在同一视角下正确显示。
内容的提问来源于stack exchange,提问作者Live Dojo
相关产品推荐
相关产品推荐

