如何调整Anchor的Y轴坐标以使其稳定贴合地面
带Mesh的AR锚点无绑定贴地面解决方案
核心逻辑
仅借用平面检测的地面高度值做一次性坐标换算,不对锚点和检测平面做任何父子绑定、位置约束,避免平面更新带动锚点位移。
具体操作步骤
- 第一步:预计算Mesh底部相对于自身锚点原点的偏移值
首先获取你要放置的Mesh的包围盒参数,计算出Mesh最低点相对于锚点自身原点的偏移值,记为meshBottomOffset,该值一般为负数(锚点原点默认在Mesh中心的场景下)。 - 第二步:一次性获取放置位置的地面高度
在你要放置锚点的X、Z坐标位置,调用平面检测接口向下检测水平面,仅读取该位置对应的地面世界Y坐标,记为detectedGroundY,拿到该值后即可终止对该平面的后续跟踪,无需保留平面实例。 - 第三步:换算锚点最终坐标并放置
仅修改锚点的Y轴坐标,X、Z坐标保持你预设的放置位置不变,换算公式如下:
换算完成后直接调用普通锚点添加接口放入场景即可,不要使用平台提供的「锚点关联平面」类接口,避免产生绑定关系。锚点最终Y坐标 = detectedGroundY - meshBottomOffset
伪代码参考
// 预计算Mesh底部偏移 Mesh targetMesh = anchorObject.GetComponent<MeshFilter>().sharedMesh; float meshBottomOffset = targetMesh.bounds.min.y - targetMesh.bounds.center.y; // 获取目标放置点的地面高度 float placePosX = 0.5f; float placePosZ = 0.5f; float groundY = ARPlaneManager.GetGroundYAtPosition(placePosX, placePosZ); // 设置最终锚点位置 Vector3 finalAnchorPos = new Vector3(placePosX, groundY - meshBottomOffset, placePosZ); ARSession.AddAnchor(finalAnchorPos, anchorObject);
效果示意图

优化建议
- 放置前可对同一点做3-5次平面检测,取Y坐标平均值作为
detectedGroundY,降低单次检测误差。 - 放置完成后即可关闭对应区域的平面检测功能,避免不必要的性能消耗。
内容的提问来源于stack exchange,提问作者indrajit
相关产品推荐
相关产品推荐

