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

ARCore Android Studio:如何基于2D屏幕坐标放置3D模型(无视深度与平面)

如何从2D屏幕坐标放置任意位置的3D模型(摆脱水平面限制)

兄弟,我太懂你这种困惑了——搜出来的教程全是教你怎么在平面上放模型,但你要的是能把模型扔到空中任意位置对吧?其实核心逻辑很简单,就是把屏幕上的2D坐标转换成3D空间里的一条射线,然后在这条线上随便选个点放模型就行,完全不用管什么水平面。下面给你一步步拆明白:

核心逻辑:屏幕坐标 → 3D射线 → 自定义位置

不管你用Unity、Unreal还是Godot,这个底层逻辑都是通用的:屏幕上的每个点,对应着从相机出发、穿过该点的一条无限延伸的射线。你要做的,就是在这条射线上选一个点,把模型放那儿就行。

1. 把2D屏幕坐标转换成3D射线

拿最常用的Unity举例子(其他引擎只是API名称不同,逻辑完全一致):
假设你已经拿到了屏幕坐标,比如鼠标点击的位置screenPos,直接用主相机的方法生成射线:

// screenPos是你的2D屏幕坐标,比如Input.mousePosition
Ray ray = Camera.main.ScreenPointToRay(screenPos);
  • Unreal里对应的是UKismetLibrary::DeprojectScreenToWorld(),会返回射线的起点和方向;
  • Godot则是用Camera3D.unproject_position()先得到一个远平面的点,再结合相机位置算出射线方向。

2. 在射线上选点放置模型

因为你不需要考虑深度,所以完全可以自己定义距离:比如让模型在相机前方10米的位置,或者让用户滑动滚轮调整距离,甚至直接固定一个位置。
还是用Unity举例:

// 取射线前方10米的点作为模型位置,10f可以随便改
Vector3 spawnPos = ray.GetPoint(10f);
// 实例化模型到这个位置
Instantiate(your3DModelPrefab, spawnPos, Quaternion.identity);

如果想要更灵活的交互(比如拖动鼠标时模型跟着射线移动,点击再确认放置),只需要在每一帧更新这个spawnPos就行。

3. 关于Anchor位置的获取

你提到的Anchor,其实就是射线上的那个3D点——本质上就是你自定义的射线位置,不需要依赖平面检测。
如果是AR场景(比如ARKit、ARCore),你甚至可以直接用这个点创建ARAnchor:
比如ARKit里的Swift代码:

// 把之前算出的spawnPos转换成ARKit需要的矩阵
let transform = matrix_float4x4(translation: spawnPos)
// 创建Anchor并添加到会话中
let anchor = ARAnchor(transform: transform)
arView.session.add(anchor: anchor)
// 把模型挂载到这个Anchor上,就能让模型固定在空间里了

这里的关键是跳过平面检测的HitTest,直接用射线计算出的位置创建Anchor,这样就不受水平面限制了。

为啥之前的教程都讲水平面?

因为很多常见场景(比如AR里放家具到地面)需要平面检测,所以教程都会侧重“射线检测到平面”的情况,但你的需求更灵活——直接跳过平面检测,用射线定位就行,完全摆脱水平面的束缚。

小提醒

  • 如果你是第一人称视角,射线的起点就是相机的位置,所以模型会出现在你的视线方向上;
  • 不同引擎的API细节有差异,但核心都是“屏幕转射线→取射线上的点”;
  • 放置模型时记得用世界空间坐标,别不小心用了局部坐标导致位置错乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:12:59