使用手势或触摸事件来旋转节点Sceneform AR Core

时间:2019-05-30 19:07:58

标签: android arcore sceneform

我在应用程序中使用AR Core作为3D Viewer。我不是将Sceneform用于AR渲染,而是用于3D渲染模型。我面临的问题是如何通过滑动手势或触摸事件360度旋转模型。使用Sceneform可以做到这一点,还是我需要使用更困难的方法,例如Open GL。

这是我的代码。

if(mymap[key]->second) { //its true
       do this 
} else {   // its false
       do this
}

if(mymap[key]->second) { do this } else {do this}

3 个答案:

答案 0 :(得分: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)
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)