【问题标题】:Rotate node with gestures or touch event Sceneform AR Core使用手势或触摸事件旋转节点 Sceneform AR Core
【发布时间】:2019-10-16 11:09:30
【问题描述】:

我在我的应用程序中使用 AR Core 作为 3D 查看器。我没有使用 Sceneform 进行 AR 渲染,而是使用 3D 渲染模型。我面临的问题是如何通过滑动手势或触摸事件 360 度旋转模型。是否可以使用场景形式,或者我需要使用更困难的方式,例如 open GL。

这是我的代码。

public class FullDegreeActivity extends AppCompatActivity {

SceneView sceneView;
Scene scene;
Node node;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_full_degree);
    inIt();
    renderObject();
}

private void inIt() {
    sceneView = findViewById(R.id.scene_view);
    scene = sceneView.getScene();
}

private void renderObject() {
    ModelRenderable.builder().setSource(this, Uri.parse("edited.sfb"))
            .build().thenAccept(modelRenderable -> {
                addNodeToScene(modelRenderable);
            }
    ).exceptionally(throwable -> {

        return null;
    });
}

private void addNodeToScene(ModelRenderable renderable) {
    node = new Node();
    node.setParent(scene);
    node.setLocalPosition(new Vector3(0f, 0f, -1f));
    node.setLocalScale(new Vector3(1f, 1f, 1f));
    node.setName("Dog");
    node.setRenderable(renderable);
    TransformableNode transformableNode = new TransformableNode(sceneView.getTransformationSystem());
    transformableNode.setParent(node);
    transformableNode.setLocalRotation(Quaternion.axisAngle(new Vector3(1f, 0, 0), 0f));
    transformableNode.setRenderable(renderable);
    transformableNode.select();
    scene.addChild(transformableNode);
}

@Override
protected void onPause() {
    super.onPause();
    sceneView.pause();
}

@Override
protected void onResume() {
    super.onResume();
    try {
        sceneView.resume();
    } catch (CameraNotAvailableException e) {
        e.printStackTrace();
    }
}
}

【问题讨论】:

  • 你有解决方案吗,我一直坚持这个如果你能分享细节会很有帮助

标签: android arcore sceneform


【解决方案1】:

我分享我的新鲜经验,也许有人还需要解决方案。

您有两种选择来实现这一目标:

  1. 如上所述,您可以实现自己的手势、缩放和旋转 使用androids标准手势或addOnPeekTouchListener场景监听器。

  2. 使用 Transformable 节点作为它的工具,然后你只需要移除平移控制器并实现一个新的旋转控制器。

让我们用 Kotlin 代码详细考虑选项 2

为拖动手势创建新的旋转控制器:

class DragRotationController(transformableNode: BaseTransformableNode, gestureRecognizer: DragGestureRecognizer) :
    BaseTransformationController<DragGesture>(transformableNode, gestureRecognizer) {

    // Rate that the node rotates in degrees per degree of twisting.
    var rotationRateDegrees = 0.5f

    public override fun canStartTransformation(gesture: DragGesture): Boolean {
        return transformableNode.isSelected
    }

    public override fun onContinueTransformation(gesture: DragGesture) {

        var localRotation = transformableNode.localRotation

        val rotationAmountX = gesture.delta.x * rotationRateDegrees
        val rotationDeltaX = Quaternion(Vector3.up(), rotationAmountX)
        localRotation = Quaternion.multiply(localRotation, rotationDeltaX)

        transformableNode.localRotation = localRotation
    }

    public override fun onEndTransformation(gesture: DragGesture) {}
}

移除翻译控制器:

node.translationController.isEnabled = false
node.removeTransformationController(translationController)

将我们的自定义旋转控制器添加到节点

val dragRotationController = DragRotationController(node, transformationSystem.dragRecognizer)
node.addTransformationController(dragRotationController)

这是 DragTransformableNode

import com.google.ar.sceneform.ux.TransformableNode
import com.google.ar.sceneform.ux.TransformationSystem

class DragTransformableNode(transformationSystem: TransformationSystem) :
    TransformableNode(transformationSystem) {

    private val dragRotationController = DragRotationController(
        this,
        transformationSystem.dragRecognizer
    )

    init {
        translationController.isEnabled = false
        removeTransformationController(translationController)
        removeTransformationController(rotationController)
        addTransformationController(dragRotationController)
    }
}

【讨论】:

  • 这似乎不起作用。找不到 addTransformationController 方法。
  • @NoumanCh 你的节点必须是 TransformableNode 才能有 addTransformationController 方法
  • 我们有一个用于 transformableNode 的 addTransformChangedListener 但没有 addTransformationController。
  • @NoumanCh 是的,它在 BaseTransformableNode 中保护了函数,您必须从 TransformableNode 扩展和实现,就像我在 DragRotationController 中所做的那样,我会更新我的答案。
  • 嘿,我已将 DragTransformableNode cod 附加到我的答案中
【解决方案2】:

您可以使用 Sceneform 轻松完成。实际上,您没有任何 Sceneform 代码。您只需使用 Android 的标准手势识别来检测手势并使用它来更新节点的旋转。 https://developer.android.com/training/gestures/detector

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 2023-04-07
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多