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

Unity动态Mesh对象基于非中心坐标放置的技术求助

解决AR中Mesh对象精准放置的问题

看起来你在AR场景里放置动态Mesh对象时遇到了位置偏移的问题,我来帮你梳理下问题所在并给出修正方案。

问题根源分析

你当前的代码存在几个关键问题:

  1. 直接使用预制体的Bounds:预制体的Renderer.bounds是基于它自身的transform坐标系的,如果预制体的轴心(pivot)不在几何中心,或者预制体本身有位置偏移,直接拿这个值计算会导致位置错误。
  2. 计算逻辑绕弯且不准确:你用meshObjectCenter - hitPositon来修正位置,这个逻辑其实没必要,反而容易引入坐标系转换的混乱。

修正后的实现方案

核心思路是:先实例化对象,再基于实例化后的对象边界计算位置,确保你获取的是实际要放置的对象的真实边界,而不是预制体的。

以下是完整的修正代码:

// 假设你已经完成射线检测,得到了有效的RaycastHit结果
if (Physics.Raycast(yourRay, out RaycastHit hit, maxDistance, groundLayerMask))
{
    // 1. 先实例化对象,这一步很重要,不要直接用预制体的属性
    GameObject spawnedMeshObj = Instantiate(ObjectPrefab);
    
    // 2. 获取实例化对象的Renderer组件(如果是MeshFilter,也可以用MeshFilter.mesh.bounds)
    Renderer objRenderer = spawnedMeshObj.GetComponent<Renderer>();
    if (objRenderer == null)
    {
        Debug.LogError("Spawned object has no Renderer component!");
        return;
    }
    
    // 3. 计算正确的放置位置:命中点 + 边界高度的一半(确保对象底部刚好落在地面上)
    // bounds.extents.y 等价于 bounds.size.y / 2,是对象中心到底部的距离
    Vector3 correctSpawnPos = hit.point + new Vector3(0, objRenderer.bounds.extents.y, 0);
    
    // 4. 设置对象位置
    spawnedMeshObj.transform.position = correctSpawnPos;
}

额外注意事项

  • 射线检测的层掩码:一定要设置groundLayerMask,只检测地面层,避免射线命中场景中的其他对象(比如刚实例化的Mesh对象)导致位置错误。
  • MeshFilter的情况:如果你的对象没有Renderer,只有MeshFilter,可以用MeshFilter.mesh.bounds来获取边界,但要注意将本地空间的边界转换为世界空间:
    MeshFilter meshFilter = spawnedMeshObj.GetComponent<MeshFilter>();
    Bounds worldBounds = meshFilter.transform.TransformBounds(meshFilter.mesh.bounds);
    Vector3 correctSpawnPos = hit.point + new Vector3(0, worldBounds.extents.y, 0);
    
  • 轴心偏移的处理:如果你的对象轴心不在几何中心,上述用bounds.extents.y的方式依然有效,因为它是基于对象的实际几何边界计算的,和轴心无关。

这样修改后,你应该能精准地将Mesh对象放置在地面命中点上方,高度刚好是对象自身高度的一半,不会再出现看似成功实则失效的情况。

内容的提问来源于stack exchange,提问作者SamSic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:21:12