首页 > 解决方案 > 如何渲染始终沿运动移动的对象

问题描述

我正在使用 node.setWorldPosition(0,0,-2f) 渲染一个对象。但我希望它总是出现在我 2 米外的镜头前

我试图显示始终面向我的相机的节点,但是当我向前移动设备时,我无法移动节点。我没有使用锚来固定我的对象。

private void nodeAlwaysFaceCamera() {
    Vector3 cameraPosition = arFragment.getArSceneView().getScene().getCamera().getWorldPosition();
    Vector3 cardPosition = node.getWorldPosition();
    Vector3 direction = Vector3.subtract(cameraPosition, cardPosition);
    Quaternion lookRotation = Quaternion.lookRotation(direction, Vector3.up());
    node.setWorldRotation(lookRotation);
}

将物体渲染到相机前方 2 米处

    node = new Node();
    node.setParent(arFragment.getArSceneView().getScene());
    node.setWorldPosition(new Vector3(0f, 0f, -2f));
    node.setRenderable(viewRenderable);

我的预期结果是物体在移动时会粘在相机上。

标签: arcoresceneform

解决方案


您应该使用相机的姿势,而不是获取世界位置。所以代替这个

Vector3 cameraPosition = arFragment.getArSceneView().getScene().getCamera().getWorldPosition();

您可以使用:

Pose cameraPose = arFragment.getArSceneView().getScene().getCamera().getPose();

或者,您可以在不旋转相机的情况下创建新姿势。

Pose cameraPose = arFragment.getArSceneView().getScene().getCamera().getPose().extractTranslation();

然后,您可以使用该姿势为您想要在相机前面的对象构图。在示例中,这会将对象放置在相机前方 2m 的相同高度处(使用第二个 cameraPose):

// Compose the Pose of the Object relative to the cameraPose
Pose objectPose = cameraPose.compose(Pose.makeTranslation(0,0,-2f));

// Create an Anchor for the object
Anchor objectAnchor = arFragment.getArSceneView().getSession().createAnchor(objectPose);
AnchorNode objectAnchorNode = AnchorNode(objectAnchor);

// Here is your code
node = new Node();
node.setParent(anchorNode);
node.setRenderable(viewRenderable);
....

推荐阅读