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

类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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:36:23