我正在寻找一个非常简单的Sceneform示例项目,不使用ARCore。
例如,只有一个 3D 立方体,可以放大和缩小,并且可以通过手指滑动来旋转。
有类似的例子或教程吗? (爪哇语)
谢谢!
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
}
}