无法使用SceneForm Arcore在android中显示glb模型

时间:2020-06-24 07:49:37

标签: android kotlin google-cloud-firestore arcore sceneform

我无法在我的应用中显示模型。我正在使用ARcore sceneform计划被检测到,并且模型是从firebase下载的,但是当我点击屏幕时它没有显示。而且,当我分别运行代码时,它可以正常工作,但是当我在一个片段中使用它时,它不起作用

class ArDisplay : Fragment() {


    var renderable : ModelRenderable? = null
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for requiredContext() fragment
        val binding = DataBindingUtil.inflate<FragmentArDisplayBinding>(inflater,R.layout.fragment_ar_display, container, false)
        
        FirebaseApp.initializeApp(requireContext())

        val storage = FirebaseStorage.getInstance()
        val modelRef = storage.getReferenceFromUrl(ArDisplayArgs.fromBundle(requireArguments()).modelLink)


        val arFragment =  childFragmentManager
            .findFragmentById(R.id.arFragment) as ArFragment

                try {
                    val file = File.createTempFile("out", "glb")
                    Toast.makeText(requireContext()," Loading " , Toast.LENGTH_LONG).show()
                  val model =  modelRef.getFile(file)
                    Toast.makeText(requireContext(),"Model Downloaded", Toast.LENGTH_LONG ).show()
                    
                    //works fine till here 
                    model.addOnSuccessListener { buildModel(file) }
                } catch (e: IOException) {

                    Log.e("an error occured while doing shit", e.printStackTrace().toString())

                }



        arFragment.setOnTapArPlaneListener { hitResult: HitResult, plane: Plane?, motionEvent: MotionEvent? ->
            val anchorNode =
                AnchorNode(hitResult.createAnchor())
            anchorNode.renderable = renderable
            arFragment.arSceneView.scene.addChild(anchorNode)
        }

        return binding.root

    }



    private fun buildModel(file: File) {

        Toast.makeText(requireContext(), "building Model" , Toast.LENGTH_LONG).show()
        val renderableSource = RenderableSource
            .builder()
            .setSource(
                requireContext(),
                Uri.parse(file.path),
                RenderableSource.SourceType.GLB
            )
            .setRecenterMode(RenderableSource.RecenterMode.ROOT)
            .build()
        ModelRenderable
            .builder()
            .setSource(requireContext(), renderableSource)
            .setRegistryId(file.path)
            .build()
            .thenAccept { modelRenderable: ModelRenderable? ->
                Toast.makeText(requireContext(), "Model built", Toast.LENGTH_SHORT).show()
                if (modelRenderable != null) {
                    renderable = modelRenderable
                }
            }
    }

    }

直到我将函数构建模型称为函数,该代码才能正常运行,构建模型中的Toast不会显示出来。

0 个答案:

没有答案