没有 ARCore 的 Sceneform 示例项目?

问题描述 投票:0回答:1

我正在寻找一个非常简单的Sceneform示例项目,不使用ARCore。

例如,只有一个 3D 立方体,可以放大和缩小,并且可以通过手指滑动来旋转。

有类似的例子或教程吗? (爪哇语)

谢谢!

java android arcore sceneform
1个回答
0
投票

基于 Sceneform 的 SceneView 的简单 VR 应用程序

2024 年 9 月 20 日测试

5年后,答案到达了收件人手中。很抱歉在 Kotlin 中发布答案,没有时间用 Java 重写它。为了使立方体基元在场景启动时可见,请确保您已实现

onResume()
onPause()
系统方法。与 ARCore 的
ArFragment
不同,Sceneform 的
SceneView
没有可用于移动、旋转和缩放 3D 模型的内置手势(即用于选择的
tap
手势、用于移动的
drag
、用于移动的
pinch
手势)。缩放,
twist
用于旋转)。下面的代码包含 3D 图元的
pinch
twist
手势激活。唯一的麻烦是,当我激活
drag
手势时,应用程序崩溃了,但我 100% 确定这是一个错误。所以我关掉了这个手势。我在这里使用了 Android Studio Koala 上的 Sceneform 1.17.1(2024.1.1 补丁 2)。

这是我的代码:

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var sceneView: SceneView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        this.sceneView = binding.sceneView
        this.sceneView.setBackgroundColor(0x555577)
        addCubeToScene(sceneView)
    }
    override fun onResume() {
        super.onResume()
        this.sceneView.resume()
    }
    override fun onPause() {
        super.onPause()
        this.sceneView.pause()
    }
    private fun makeTransformSystem(): TransformationSystem {
        val visualizer = FootprintSelectionVisualizer()
        val metrics = resources.displayMetrics
        val transformSystem = TransformationSystem(metrics, visualizer)
        return transformSystem
    }
    private fun addCubeToScene(scnView: SceneView) {
        MaterialFactory.makeOpaqueWithColor(this, Color(1f,0f,0f))
            .thenAccept {
                val size = Vector3(2f,2f,2f)
                val cube = ShapeFactory.makeCube(size, Vector3(), it)
                val transformSystem = this.makeTransformSystem()

                val node = TransformableNode(transformSystem)
                node.renderable = cube
                node.worldPosition = Vector3(0f,0.5f,-2f)
                node.worldRotation = Quaternion.eulerAngles(Vector3(0f,45f,0f))
                node.select()

                node.translationController.isEnabled = false
                node.rotationController.isEnabled = true
                node.scaleController.isEnabled = true

                scnView.scene.camera.worldPosition = Vector3(0f,0f,2f)
                scnView.scene.camera.farClipPlane = 50f
                scnView.scene.addChild(node)

                sceneView.scene.addOnPeekTouchListener { htr, event ->
                    transformSystem.onTouch(htr, event)
                }
            }
    }
}

activity_main.xml
布局:

<com.google.ar.sceneform.SceneView
    android:id="@+id/sceneView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

build.gradle.kts
(模块:应用程序):

android {
    buildFeatures {
        viewBinding = true
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.