ARCore Android Studio:如何基于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

