类Valheim基地建造系统:带旋转的游戏对象射线对齐问题
Valheim风格基地建造系统的对象对齐问题解决方案
问题描述
我正在开发类似Valheim的基地建造系统,但在游戏对象间对齐功能上遇到问题。我希望能够在相机注视点放置带有不同旋转角度的对象,并使其与其他对象贴合,实现经典基地建造系统的效果。
我曾尝试基于Mesh Renderer的Bounds尺寸计算对象需从射线检测碰撞点移动的距离,代码如下:visualization.transform.position = currentHit.point + Vector3.Scale(visualization.Bounds.extents, currentHit.normal.normalized);
但该方法仅在直角与直线角度场景下有效,当对象存在不同旋转角度时会出现问题。请问是否存在不使用Bounds,而是基于Renderer/Collider尺寸和对象旋转角度来计算该移动距离的方法?
解决方案
问题根源在于直接使用世界空间下的Bounds.extents,没有考虑对象旋转带来的空间变换。可以通过局部空间到世界空间的向量转换来适配任意旋转角度,具体步骤如下:
1. 获取局部空间的半尺寸
不管用Collider还是Renderer,都取局部空间下的半尺寸,这个值不受对象旋转影响:
- 用BoxCollider:
collider.size / 2 - 用MeshRenderer:
renderer.localBounds.extents
2. 转换为世界空间方向向量
利用对象的Transform.TransformVector()方法,把局部半尺寸向量转换到世界空间,这样就自动适配了当前的旋转角度。
3. 计算贴合偏移量
将转换后的世界半尺寸向量在碰撞法线上做投影,得到沿法线方向的偏移分量,叠加到碰撞点上即可让对象完美贴合表面。
示例代码
// 获取目标对象的BoxCollider(也可以替换为MeshRenderer) BoxCollider collider = visualization.GetComponent<BoxCollider>(); // 局部空间下的半尺寸 Vector3 localHalfSize = collider.size / 2f; // 将局部半尺寸转换为世界空间向量(适配当前旋转) Vector3 worldHalfSize = visualization.transform.TransformVector(localHalfSize); // 计算沿碰撞法线方向的偏移 Vector3 offset = Vector3.Project(worldHalfSize, currentHit.normal) * currentHit.normal.normalized; // 设置最终放置位置 visualization.transform.position = currentHit.point + offset;
补充提示
- 如果用MeshRenderer,只需把代码中的
collider.size / 2f替换为visualization.GetComponent<MeshRenderer>().localBounds.extents即可,逻辑完全一致。 - 对于非规则碰撞器(如MeshCollider),可以用其包围盒的局部半尺寸计算,基地建造场景下包围盒的精度足够满足对齐需求。
- 这种方法的核心是区分局部与世界空间,避免了直接使用世界Bounds在旋转时产生的坐标偏差。
内容的提问来源于stack exchange,提问作者Kiket95
相关产品推荐
相关产品推荐

