如何渲染始终沿运动运动的对象

时间:2019-05-31 10:04:06

标签: arcore sceneform

我正在使用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);

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

1 个答案:

答案 0 :(得分:0)

您应该使用相机的姿势来代替获取世界位置。因此,除了此

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);
....