簡體   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