繁体   English   中英

Kotlin- Sceneform - 从服务器直接加载 .sfb 模型。 不工作

[英]Kotlin- Sceneform - Load .sfb models from server direct. Not working

Iam 和 AR 安卓应用程序。 我可以从资产加载我的 .sfb 文件。 我想从直接服务器加载以保护我的资产。 它从资产文件夹加载。 不是来自直接服务器。 我使用下面的代码请帮我解决这个问题。

package com.example.a320_ar

import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AlertDialog
import com.google.ar.core.Anchor
import com.google.ar.core.Plane
import com.google.ar.sceneform.AnchorNode
import com.google.ar.sceneform.HitTestResult
import com.google.ar.sceneform.SkeletonNode
import com.google.ar.sceneform.animation.ModelAnimator
import com.google.ar.sceneform.rendering.ModelRenderable
import com.google.ar.sceneform.ux.ArFragment
import com.google.ar.sceneform.ux.TransformableNode
import kotlinx.android.synthetic.main.activity_main.*
import java.io.File

class MainActivity : AppCompatActivity() {
    lateinit var arFragment: ArFragment
    private  lateinit var model: Uri
    private var rendarable: ModelRenderable?=null
    private var animator: ModelAnimator? = null
    //private var modellink:String = "A320_Anim.sfb"
    private var modellink:String = "http://10.0.0.193:90/fbx/A320_Anim.sfb"

    @RequiresApi(Build.VERSION_CODES.N)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        arFragment = sceneform_fragment as ArFragment

        arFragment.setOnTapArPlaneListener { hitResult, plane, motionEvent ->
            if (plane.type != Plane.Type.HORIZONTAL_UPWARD_FACING) {
                return@setOnTapArPlaneListener
            }

            var anchor = hitResult.createAnchor()
            btnStart.setOnClickListener {
                placeObject(
                    arFragment,
                    anchor,
                    Uri.parse(modellink)
                )
            }

        }
    }

    @RequiresApi(Build.VERSION_CODES.N)
    private fun animateModel(name: String) {
        animator?.let { it->
            if(it.isRunning){
                it.end()
            }
        }
        rendarable?.let { modelRenderable ->
            val data = modelRenderable.getAnimationData(name)
            animator = ModelAnimator(data,modelRenderable)
            animator?.start()
        }
    }

    @RequiresApi(Build.VERSION_CODES.N)
    private fun placeObject(arFragment: ArFragment, anchor: Anchor?, model: Uri?) {

        ModelRenderable.builder()
            .setSource(arFragment.context,model)
            .build()
            .thenAccept{
                rendarable = it
                addtoScene(arFragment, anchor, it)
            }
            .exceptionally {
                val builder = AlertDialog.Builder(this)
                builder.setMessage( it.message).setTitle("Error")
                val dialog = builder.create()
                dialog.show()
                return@exceptionally null
            }
    }

    private fun addtoScene(arFragment: ArFragment, anchor: Anchor?, it: ModelRenderable?) {

        val anchorNode = AnchorNode(anchor)
        val skeletonNode = SkeletonNode()
        skeletonNode.renderable = rendarable
        Toast.makeText(this,"inside add scene",Toast.LENGTH_SHORT).show()
        val node = TransformableNode(arFragment.transformationSystem)
        node.addChild(skeletonNode)
        node.setParent(anchorNode)

        node.setOnTapListener { v: HitTestResult?, event: MotionEvent? ->
            //msgText.text = "Tapped me...$anchorNode  ---  $anchor --- $skeletonNode"
           // var bt = findViewById<Button>(R.id.btnDel)
            //bt.visibility = View.VISIBLE
            //removeAnchorNode(anchorNode)
            //bt.setOnClickListener { removeAnchorNode(anchorNode) }
        }

        arFragment.arSceneView.scene.addChild(anchorNode)
    }

}

它的工作正常没有错误。 但它没有在片段上显示我的对象。

 private var modellink:String = "http://10.0.0.193:90/fbx/A320_Anim.sfb" (not loading .sfb)

private var modellink:String = "A320_Anim.sfb" (Loading the .sfb- woring fine)

请帮我直接从服务器加载模型。 我正确使用了所有权限。

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <uses-permission android:name="android.permission.CAMERA"/>

提前致谢,赛阿都拉欣

您还在使用旧的 1.6 版本的 Sceneform 吗? 您可以尝试新维护的版本,也可以放弃 sfb 格式并切换到 glTF。 维护的版本是最新的,与 android 依赖项和 ARCore/Filament 相关。

那么对于您的第二个问题,如果您想保护您的资产,您必须从受密码保护的 API-Endpoint 提供服务,但您必须托管自己的服务器,也许存在一些更简单的解决方案。 字符串或文本文件可以直接使用板载库( https://developer.android.com/guide/topics/security/cryptography )进行保护

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM