如何在 Android 上的 Sceneform/ARCore 中处理模型缩放?

如何解决如何在 Android 上的 Sceneform/ARCore 中处理模型缩放?

我正在尝试使用来自服务器 Api 的 AR Core Sceneform 加载 3d 模型。模型位置旋转也来自 API 。我能够加载 3D 模型。但问题是,两个 3D 模型都有不同的比例值。但看起来很明智,两种型号的尺寸都是一样的。这是我的问题。我无法以相同的尺寸渲染两个模型。我尝试了很多方法但没有用。不幸的是,互联网上也没有 awnser。

这是缩放3D模型的代码

modelNode.setLocalScale(new Vector3(0.0005f,0.0005f,0.0005));

ModelRenderable.builder()
    .setSource(
            this,Uri.fromFile(getModelPath(modelPathArray.get(finalI),jsonObjectDuplicate)))
    .setIsFilamentGltf(true)
    .build()
    .thenAccept(
            modelRenderable -> {
                OfflineARActivity activity = weakActivity.get();
                if (activity != null) {
                    activity.renderable = modelRenderable;

                    // Create the Anchor.
                    Anchor anchor = hitResult.createAnchor();
                    AnchorNode anchorNode = new AnchorNode(anchor);
                    anchorNode.setParent(arFragment.getArSceneView().getScene());

                    TransformableNode modelNode = new TransformableNode(arFragment.getTransformationSystem());
                    modelNode.setParent(anchorNode);


                    //Get Positions From Saved Data
                   // TinyDB tinyDB = new TinyDB(OfflineARActivity.this);
                    String position = tinyDB.getString(modeNameArray.get(finalI)+"Position");
                    String scale = tinyDB.getString(modeNameArray.get(finalI)+"Scale");
                    String rotate = tinyDB.getString(modeNameArray.get(finalI)+"Rotation");
                    String anim = tinyDB.getString(modeNameArray.get(finalI)+"Animation");

                   // Log.v("Plugxr","Scale : "+scale);
                   // Log.v("Plugxr","Model Name Inside : "+modeNameArray.get(finalI));





                    // Positions
                    try {
                        JSONObject jsonObject = new JSONObject(position);

                        String px = jsonObject.getString("x");
                        String py = jsonObject.getString("y");
                        String pz = jsonObject.getString("z");
                        Vector3 positions = new Vector3(Float.parseFloat(px),Float.parseFloat(py),Float.parseFloat(pz));

                        modelNode.setLocalPosition(positions);

                        Log.v("Plugxr","Positions : "+positions.toString());
                        Log.v("Plugxr","Positions : "+modelNode.getLocalPosition());
                        Log.v("Plugxr","Positions : "+modeNameArray.get(finalI));


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }



                    // Scaling
                    try {
                        JSONObject jsonObject = new JSONObject(scale);

                        String sx = jsonObject.getString("x");
                        String sy = jsonObject.getString("y");
                        String sz = jsonObject.getString("z");
                        Vector3 scaling = new Vector3(Float.parseFloat(sx),Float.parseFloat(sy),Float.parseFloat(sz));

                       // Log.v("Plugxr","Scale : "+scaling);
                       // Log.v("Plugxr","Scale : "+modeNameArray.get(finalI));

                        // Bounding Box





                        /*Vector3 finalSize =
                                    new Vector3(
                                            (float) (Math.round((size.x * transformableNodeScale.x * 100) * 10) / 10.0),(float) (Math.round((size.y * transformableNodeScale.y * 100) * 10) / 10.0),(float) (Math.round((size.z * transformableNodeScale.z * 100) * 10) / 10.0));*/

                        ScaleController scaleController = modelNode.getScaleController();
                        scaleController.setMaxScale((scaling.x+scaling.y+scaling.z)/3);
                        scaleController.setMinScale(((scaling.x+scaling.y+scaling.z)/3)-0.00001f);


                        /*Box boundingBox = (Box) modelRenderable.getCollisionShape();
                        if (boundingBox != null) {
                            Vector3 boundingBoxSize = boundingBox.getSize();
                            //float maxExtent = Math.max(boundingBoxSize.x,Math.max(boundingBoxSize.y,boundingBoxSize.z));
                            //float targetSize = 0.1f; // Whatever size you want.
                           // float scaleBounfing = targetSize / maxExtent;


                            Vector3 finalSize =
                                    new Vector3(
                                            (float) (Math.round((boundingBoxSize.x * modelNode.getWorldScale().x * 100) * 10) / 10.0),(float) (Math.round((boundingBoxSize.y * modelNode.getWorldScale().y * 100) * 10) / 10.0),(float) (Math.round((boundingBoxSize.z * modelNode.getWorldScale().z * 100) * 10) / 10.0));

                            modelNode.setLocalScale(new Vector3(finalSize.x,finalSize.y,finalSize.z));




                        }*/

                        //Log.v("Plugxr","Scale1 : "+modelNode.getLocalScale());

                        modelNode.setLocalScale(new Vector3(scaling.x,scaling.y,scaling.z));

                     //   Log.v("Plugxr","Scale2 : "+modelNode.getLocalScale() );
                       // modelNode.setLocalScale(scaling);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }


                    // Rotation
                    try {
                        JSONObject jsonObject = new JSONObject(rotate);

                        String rx = jsonObject.getString("x");
                        String ry = jsonObject.getString("y");
                        String rz = jsonObject.getString("z");

                        Quaternion qrx = Quaternion.eulerAngles(new Vector3(Float.parseFloat(rx) - 90,Float.parseFloat("0.0"),Float.parseFloat("0.0")));
                        Quaternion qry = Quaternion.eulerAngles(new Vector3(Float.parseFloat("0.0"),Float.parseFloat(ry),Float.parseFloat(rz)));
                        modelNode.setLocalRotation(Quaternion.multiply(qrx,qry));


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }


                    modelNode.setRenderable(modelRenderable);
                    modelNode.select();
                    // Set Model Name
                    //modelNode.setName(modelPathArray.get(finalI).getName());
                    // Add model name to modelArray
                    //modelsArray.add(modelPathArray.get(finalI).getName());



                    // Later
                    FilamentAsset filamentAsset = modelNode.getRenderableInstance().getFilamentAsset();
                    if (filamentAsset.getAnimator().getAnimationCount() > 0) {
                        animators.add(new AnimationInstance(filamentAsset.getAnimator(),System.nanoTime()));
                    }

                    Color color = colors.get(nextColor);
                    nextColor++;
                    for (int j = 0; j < modelRenderable.getSubmeshCount(); ++j) {
                        Material material = modelRenderable.getMaterial(j);
                        material.setFloat4("baseColorFactor",color);
                    }


                }
            })
    .exceptionally(
            throwable -> {
                /*Toast toast =
                        Toast.makeText(this,"Unable to load model"+modeNameArray.get(finalI),Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER,0);
                toast.show();*/
                return null;
            });

解决方法

试试这个:

Anchor anchor = hitResult.createAnchor();
AnchorNode anchorNode = new AnchorNode(anchor);

node.getScaleController().setMinScale(2.0f);
node.getScaleController().setMaxScale(3.0f);

node.setLocalScale(new Vector3(2.5f,2.5f,2.5f));
node.setParent(anchorNode);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-