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

如何获取ARCore场景中所有物体及其坐标,避免新物体放置重叠?

ARCore 获取已放置物体列表、坐标及避免重叠实现方案

1. 维护已放置物体集合

ARCore没有内置的已放置物体管理机制,需要自行维护一个集合来追踪所有放置的物体:

// 全局变量,存储所有已放置的物体
private List<GameObject> _placedObjects = new List<GameObject>();

每次成功放置物体后,将其加入集合:

public void SpawnAndTrackObject(GameObject prefab, Vector3 spawnPos, Quaternion spawnRot)
{
    GameObject newObj = Instantiate(prefab, spawnPos, spawnRot);
    _placedObjects.Add(newObj);
    
    // 自动添加碰撞体(若物体没有的话),用于后续重叠检测
    if (newObj.GetComponent<Collider>() == null)
    {
        newObj.AddComponent<BoxCollider>();
    }
}

2. 获取已放置物体的坐标与边界信息

直接通过物体的Transform组件获取世界坐标,结合Collider的包围盒获取物体的实际占用空间:

public void LogPlacedObjectsData()
{
    foreach (GameObject obj in _placedObjects)
    {
        Vector3 worldPos = obj.transform.position;
        Bounds objBounds = obj.GetComponent<Collider>().bounds;
        
        Debug.Log($"物体:{obj.name},坐标:({worldPos.x:F2}, {worldPos.y:F2}, {worldPos.z:F2}),包围盒范围:{objBounds}");
    }
}

3. 放置前检测重叠

有两种常用方式判断目标位置是否与现有物体重叠:

方式一:遍历集合检测包围盒相交

public bool IsSpawnPositionValid(Vector3 targetPos, Vector3 objectSize)
{
    Bounds targetBounds = new Bounds(targetPos, objectSize);
    
    foreach (GameObject existingObj in _placedObjects)
    {
        Bounds existingBounds = existingObj.GetComponent<Collider>().bounds;
        if (targetBounds.Intersects(existingBounds))
        {
            return false; // 存在重叠,位置无效
        }
    }
    return true; // 位置可用
}

方式二:使用物理引擎的重叠检测API

适合快速检测场景内所有碰撞体,无需遍历自己的集合:

public bool IsSpawnPositionValid(Vector3 targetPos, Vector3 objectSize)
{
    // 用物体一半尺寸创建检测范围(OverlapBox的第二个参数是半长)
    Collider[] overlappingColliders = Physics.OverlapBox(targetPos, objectSize / 2f);
    
    // 过滤掉可能的地面或场景静态碰撞体(根据你的需求调整)
    foreach (Collider col in overlappingColliders)
    {
        if (_placedObjects.Contains(col.gameObject))
        {
            return false;
        }
    }
    return true;
}

注意事项

  • 确保所有已放置物体都带有Collider组件,否则无法正确获取边界或进行碰撞检测;复杂形状物体建议使用MeshCollider提升检测精度
  • 若物体支持移动/删除操作,记得同步更新_placedObjects集合,避免无效数据
  • 可在检测时添加间隙阈值,比如将目标包围盒扩大一点,让新物体与现有物体保持一定距离,提升体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:53:15