【问题标题】:SceneForm sceneview always black in fragmentSceneForm 场景视图在片段中始终为黑色
【发布时间】:2020-12-03 11:52:07
【问题描述】:

我正在尝试在 sceneview 上渲染 3d 模型,但无论我做什么都会出现黑屏。我想做的是像在 ARFragment 中一样加载 3d 模型,但具有更多类似场景视图的功能。

这是我的布局代码

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"


    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ui.ThreeDView">

    <com.google.ar.sceneform.SceneView
        android:id="@+id/SceneView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

这是我的片段

class ThreeDView : Fragment(R.layout.sceneview_fragment) {
    lateinit var model: ModelRenderable
    lateinit var link: String
    lateinit var binding: SceneviewFragmentBinding
    lateinit var mScene: Scene
    lateinit var sceneView : SceneView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    binding = SceneviewFragmentBinding.bind(view)
    val viewModel = (activity as MainActivity).activitySharedViewModel
    link = viewModel.modelUrl.value.toString()
    viewModel.modelUrl.observe(viewLifecycleOwner, {
        link = viewModel.modelUrl.value.toString()
    })
    sceneView = binding.SceneView



       Log.e("shown", "yes shown")
       createScene()

       Log.e("mot show", "not shown")


}


private fun createScene() {
    mScene = binding.SceneView.scene

    ModelRenderable.builder()
            .setSource(requireContext(), Uri.parse(link))
            .build()
            .thenAccept { renderable: ModelRenderable? ->
                if (renderable != null) {

                    addNodeToScene(renderable)
                }
            }
            .exceptionally { throwable: Throwable? ->
                Log.e("Sceneform", "failed to load model")
                null
            }
}

private fun addNodeToScene(model: ModelRenderable) {
    val cakeNode = Node()


    cakeNode.apply {
        renderable= model
        localPosition =Vector3(.3F, .3F, .3F)
        setParent(mScene)

    }
    with(mScene)
    {
        sunlight.let {
            Light.builder(Light.Type.SPOTLIGHT)
                    .setColor(Color(YELLOW))
                    .setShadowCastingEnabled(true)
                    .build()

        }
        addChild(cakeNode)
    }


    mScene.addChild(cakeNode)


            }

override fun onResume() {
    super.onResume()
    try {
        sceneView.resume()
    }
    catch (e : CameraNotAvailableException)
    {
        e.message
    }


}

override fun onPause() {
    super.onPause()
    sceneView.pause()
}
}

我已经尝试了很多东西,比如将 scenview 放入 oncreate/oncreateview 也尝试了这个答案 Black screen after loading SceneView, using Scenform, into a fragment,但似乎没有任何效果

【问题讨论】:

  • 您是否尝试将 sceneView 初始化移动到 onCreateView?此外,由于您只看到黑屏,这意味着您可能对 sceneView 有问题 - 我会在 xml 中更改 sceneView 的颜色并注释其余代码 - 在添加节点和模型之前确保它运行良好
  • 是的,它会改变颜色我之前尝试过在创建视图中启动场景视图,但它没有解决同样的问题
  • 如果它适用于颜色而不是我认为问题出在sceneView。
  • 可能是什么问题,那么我对这一切完全陌生
  • 1.尝试使用不同的模型,看看是否存在问题。您还可以在外部模型查看器中查看您的模型 - 是否有可以从不良角度覆盖模型的平面?模型上的颜色是否足以在黑色场景视图上可见?模型的大小是多少 - 也许它实际上是可见的,只是不在相机视图中 2. 尝试相机和节点的不同位置(确保将节点设置在相机前面) 3. 您现在也可以尝试评论模型并设置相机和灯光,使黑色的场景视图实际上看起来不黑。

标签: android kotlin arcore sceneform sceneview


【解决方案1】:

问题在于未设置背景颜色。所以,当我把它改成白色时,它就开始完美地工作了。

binding.SceneView.renderer!!.setClearColor(Color(LTGRAY))

此外,如果您使用导航组件,请确保您的导航图位于片段容器视图中,而不是片段中

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多