Sceneform中屏幕底部中间显示元素的Vector3参数及代码问题
在Sceneform里把指南针固定到屏幕底部中间的正确姿势
嘿,我来帮你搞定这个问题!首先得搞明白:你之前用Pose.makeTranslation(0, -0.07f, -0.2f)没生效,核心原因是这个方法设置的是3D空间里的位置,没法让元素固定在屏幕上——毕竟相机一动,3D节点的屏幕位置就跟着变了。要实现屏幕固定的UI,得用Sceneform专门的屏幕空间节点,或者通过布局来控制。
推荐方法:用ScreenSpaceNode(省心又靠谱)
Sceneform给我们准备了ScreenSpaceNode,专门用来把UI钉在屏幕上,位置基于屏幕坐标,和3D空间无关。步骤很简单:
- 先创建这个节点,把它挂到AR场景里:
ScreenSpaceNode compassNode = new ScreenSpaceNode(); compassNode.setParent(arFragment.getArSceneView().getScene());
- 加载你的指南针ViewRenderable(就是你写的布局或者图标):
ViewRenderable.builder() .setView(context, R.layout.your_compass_layout) .build() .thenAccept(renderable -> compassNode.setRenderable(renderable));
- 设置屏幕位置到底部中间:
这里用的是相对屏幕坐标,左上角是(0,0),右下角是(1,1)。底部中间的话,X轴取0.5(正好中间),Y轴取0.1左右(靠近底部,你可以自己调这个值,比如0.08更靠下,0.15稍微往上):
compassNode.setScreenPosition(new Vector2(0.5f, 0.1f));
为啥你的原代码不行?(顺便解释下3D坐标的坑)
你之前写的Pose.makeTranslation(0, -0.07f, -0.2f),问题出在Z轴:Sceneform里相机在(0,0,0),Z轴正方向是相机往前看的方向,你设成-0.2f等于把节点放到相机背后了,相机当然看不到!就算改成Z=0.2f(相机前方0.2米),这个节点也只是在3D空间里的某个位置,你移动相机的时候,它会跟着偏离屏幕底部中间——这显然不是你要的固定UI效果。
要是你非要试试3D坐标(真不推荐),可以改成这样,但记住这只是临时的,相机一动就歪:
// X=0(水平中间),Y=-0.1(向下偏移,自己调大小),Z=0.3(相机前方0.3米) Pose pose = Pose.makeTranslation(0f, -0.1f, 0.3f); compassNode.setLocalPose(pose);
最后补个小细节:布局要对齐
用ViewRenderable的时候,你的指南针布局(比如your_compass_layout.xml)记得设成居中,不然可能会偏移:
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/your_compass_icon" android:layout_gravity="center"/>
内容的提问来源于stack exchange,提问作者Zwiep
相关产品推荐
相关产品推荐

