我正在使用 ARCore 开发应用程序。在此应用中,我需要:
1)将物体始终停留在世界空间中的同一姿势。按照“使用锚点”文章的建议(https://developers.google.com/ar/develop/developer-guides/anchors),我将锚点附加到 ARCore会话。也就是说,我根本没有使用Trackable。
2)作为次要条件,必须自动放置对象,即不要在屏幕上轻按。
我设法解决了两个必要条件,现在,对象已经“浮空”在我面前,这种方式(非常常见的代码):
private void onSceneUpdate(FrameTime frameTime) {
...
if (_renderable!=null && _anchorNode==null) {
float[] position = {0f,0f,-10f};
float[] rotation = {0,0,0,1};
//
Anchor anchor=_arFragment.getArSceneView().getSession().createAnchor(new Pose(position,rotation));
//
_anchorNode = new AnchorNode(anchor);
_anchorNode.setRenderable(_renderable);
_anchorNode.setParent(_arFragment.getArSceneView().getScene());
_anchorNode.setLocalScale(new Vector3(0.01f,0.01f,0.01f)); //cm -> m
...
}
由于我希望将对象放在地板上,因此我需要找出地板上的物理(设备)相机的高度是多少,以便从当前对象的Y坐标中减去该数字:
float[] position = {0f,HERE_THE_VALUE_TO_SUBTRACT_FROM_CAMERA_HEIGHT,-10f};
当然,当使用飞机可追踪对象时,这是一个简单的实现,但是在这里,我具有上面提到的要求。
我设法解决了两个必要条件,现在对象“浮在”我的面前。
当我希望将对象放在地板上时,我需要找出地板上的物理(设备)相机的高度是多少,以便从当前对象的Y坐标中减去该数字。
尝试使用其他相机/设备 Pose 检索API,即: frame.getAndroidSensorPose(), frame.getCamera()。getPose() >和 frame.getCamera()。getDisplayOrientedPose()显示的值无效。
感谢您的建议。
P.S .:当然,使用平面可跟踪对象时,这是一个简单的实现,但是在这里,我还有上面提到的其他要求。
好吧,我认为我们有两种方法可以满足要求:
1)保留更改后的代码,继续使用会话锚点,要求用户启动应用程序,并遵循设备在地板上的“校准过程”。由于这是一款专业用途的应用程序,而不是消费类应用程序,因此我们认为它非常适合;
2)使用常见的 Trackables ,通过通常的地板作为锚点,包括该锚点的位置来计算3D模型的位置。