我是AR for Android的新手,我想实现以下行为。我使用的是Sceneform。
implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.15.0'我有一个3D模型(简单的长方体)。下面是创建长方体的方法。
private ModelRenderable 3dModel;
private void createModel(AnchorNode anchorNode) {
TransformableNode cartoonPersonNodeThree = new TransformableNode(arFragment.getTransformationSystem());
cartoonPersonNodeThree.getScaleController()
.setEnabled(false); // Disable scaling
cartoonPersonNodeThree.getTranslationController()
.setEnabled(false); // Disable moving
cartoonPersonNodeThree.setParent(anchorNode);
cartoonPersonNodeThree.setRenderable(3dModel);
cartoonPersonNodeThree.select();}
我需要这个模型显示在用户面前,当表面被检测到,它应该随着相机的移动。
下面的代码可以做到这一点。3D模型显示在中心和相机前面1米处。
arFragment.getArSceneView()
.getScene()
.addOnUpdateListener(frameTime -> {
Frame frame = arFragment.getArSceneView()
.getArFrame();
if (frame == null) {
return;
}
if (frame.getCamera()
.getTrackingState() != TrackingState.TRACKING) {
return;
}
if (isModelAlreadyInPlace) {
return;
}
if (isModelLocked) {
return;
}
removeAnchorNode(anchorNode); // Remove previous 3D model
// Place the anchor 1m in front of the camera.
Session session = arFragment.getArSceneView()
.getSession();
Anchor newMarkAnchor = session.createAnchor(frame.getCamera()
.getPose()
.compose(Pose.makeTranslation(0, 0, -1f)) //This will place the anchor 1M in front of the camera
.extractTranslation());
AnchorNode addedAnchorNode = new AnchorNode(newMarkAnchor);
addedAnchorNode.setRenderable(cartoonPersonThree);
addedAnchorNode.setParent(arFragment.getArSceneView()
.getScene());
anchorNode = addedAnchorNode;
});这里的问题是3D模型在空中,如果我把相机移到天花板上,3D模型就会在那里。


有没有办法把3D模型和地板对齐?
发布于 2021-01-14 18:59:08
这段代码帮助我获得了我想要的确切行为。我们有一个点击屏幕中心的HitTest,所以我们可以得到一个"HitResult“,并从中获得锚点。所以这是一种伪点击事件,我们在每个帧通道中执行。
private fun initArFragment() {
arFragment.arSceneView.scene.addOnUpdateListener {
arFragment.arSceneView?.let { sceneView ->
sceneView.arFrame?.let { frame ->
if (frame.camera.trackingState == TrackingState.TRACKING) {
val hitTest =
frame.hitTest(sceneView.width / 2f, sceneView.height / 2f)
val hitTestIterator = hitTest.iterator()
if (hitTestIterator.hasNext()) {
if (!placed) {
val hitResult = hitTestIterator.next()
val anchor = hitResult.createAnchor()
if (anchorNode == null) {
anchorNode = AnchorNode()
anchorNode?.setParent(sceneView.scene)
transformableNode =
DragTransformableNode(arFragment.transformationSystem)
transformableNode?.setParent(anchorNode)
boxNode = createBoxNode(.4f, .6f, .4f)
boxNode?.setParent(transformableNode)
}
anchorNode?.anchor?.detach()
anchorNode?.anchor = anchor
}
}
}
}
}
}
}https://stackoverflow.com/questions/65303465
复制相似问题