Google ARCore Sceneform 如何检测光线击中 ar 对象

如何解决Google ARCore Sceneform 如何检测光线击中 ar 对象

我是 Google AR 核心和 Sceneform 的新手。我想在 Android Studio 上开发一个基本的 fps 游戏,当用户触摸屏幕上的任何地方时,将创建 AR 对象,如果按下按钮,将从屏幕中心射出一条光线,如果光线击中任何创建的 AR对象,分数​​会增加。 代码在下面,但我不能再继续了。我该怎么办?

public class MainActivity extends AppCompatActivity{
    private static final String TAG = MainActivity.class.getSimpleName();
    private static final double MIN_OPENGL_VERSION = 3.0;

    private ArFragment arFragment;
    private ModelRenderable mRenderable;
    private ImageButton imageButton;
    private TextView scoreText;
    private int score=0;
    private Set<Vector3> position = new HashSet<Vector3>();


   // Set<Vector3> obj_set = new HashSet<Vector3>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (!checkIsSupportedDeviceOrFinish(this)) {
            return;
        }
        setContentView(R.layout.activity_main);

        arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);
        imageButton = (ImageButton) findViewById(R.id.imageButton);
        scoreText = (TextView) findViewById(R.id.scoreText);


        setUpModel();
        setUpPlane();

        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    Camera camera = arFragment.getArSceneView().getScene().getCamera();
                    Ray ray = new Ray(camera.getWorldPosition(),camera.getForward());

                    HitTestResult result = arFragment.getArSceneView().getScene().hitTest(ray);
                    if (result.getNode() != null && result.getDistance() < 0) {
                        // Hit something
                        //doSomething(result.getNode());
                        Log.e(TAG,"RAYCASTING ERROR");
                    }else{
                        Iterator value = position.iterator();
                        while(value.hasNext()){
                            if(position.equals(result.getPoint())){
                                Toast.makeText(getApplicationContext(),"HIT WAS DETECTED",Toast.LENGTH_SHORT).show();
                                score = score + 5;
                                scoreText.setText("SCORE: " + score + "");
                                Log.e(TAG,"HEY THERE");
                            }
                            else{
                                Log.e(TAG,"NOOOOOOO");
                            }
                        }
                    }

                } catch (Exception e) {
                    Log.e(TAG,"ERROR ON BUTTON");
                }
            }
        });

    }

    private void setUpModel() { //Load the model
        WeakReference<MainActivity> weakActivity = new WeakReference<>(this);

        ModelRenderable.builder()
                .setSource(this,R.raw.model)
                .setIsFilamentGltf(true)
                .build()
                .thenAccept(modelRenderable -> {
                    MainActivity activity = weakActivity.get();
                    if (activity != null) {
                        mRenderable = modelRenderable;
                    }
                })
                .exceptionally(throwable -> {
                    Toast.makeText(MainActivity.this,"Model can not be loaded!",Toast.LENGTH_SHORT).show();
                    return null;
                });
    }

    private void setUpPlane() {//Attach the scene to the node
        arFragment.setOnTapArPlaneListener(new BaseArFragment.OnTapArPlaneListener() {
            @Override
            public void onTapPlane(HitResult hitResult,Plane plane,MotionEvent motionEvent) {

                // Creates the anchor
                Anchor anchor = hitResult.createAnchor();
                AnchorNode anchorNode = new AnchorNode(anchor);
                anchorNode.setParent(arFragment.getArSceneView().getScene());
                createModel(anchorNode);
            }
        });
    }
    private void createModel(AnchorNode anchorNode) {// Create the transformable model and add it to the anchor
        TransformableNode node = new TransformableNode(arFragment.getTransformationSystem());
        node.setParent(anchorNode);
        node.setRenderable(mRenderable);
        node.select();

        position.add(anchorNode.getWorldPosition());

    }

    public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            Log.e(TAG,"Sceneform requires Android N or later");
            Toast.makeText(activity,"Sceneform requires Android N or later",Toast.LENGTH_LONG).show();
            activity.finish();
            return false;
        }
        String openGlVersionString =
                ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE))
                        .getDeviceConfigurationInfo()
                        .getGlEsVersion();
        if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) {
            Log.e(TAG,"Sceneform requires OpenGL ES 3.0 later");
            Toast.makeText(activity,"Sceneform requires OpenGL ES 3.0 or later",Toast.LENGTH_LONG)
                    .show();
            activity.finish();
            return false;
        }
        return true;
    }
}

解决方法

我不确定我是否完全理解您想要实现的目标,但是如果您想在用户指向对象并按下按钮时增加分数,那么您可以检查结果 != null 然后执行您的操作,为什么在 else 部分有命中检测逻辑?所以你可以:

# A tibble: 12 x 11
   file                        gene      geneName score    ES      pvalue   var predict1 predict2         fdr  pass
   <chr>                       <chr>     <chr>    <dbl> <dbl>       <dbl> <dbl>    <dbl>    <dbl>       <dbl> <dbl>
 1 Documents/mydata/data01.csv ENSG00089 KIZ       5.28   0.4 0.000000127 0.004     0.08     0.05 0.000000762     1
 2 Documents/mydata/data01.csv ENSG00089 KIZ       5.28   0.4 0.00105     0.004     0.08     0.05 0.00158         1
 3 Documents/mydata/data01.csv ENSG00089 KIZ       5.28   0.4 0.1         0.004     0.08     0.05 0.1             0
 4 Documents/mydata/data01.csv ENSG00089 KIZ       5.28   0.4 0.0000111   0.004     0.08     0.05 0.0000333       1
 5 Documents/mydata/data01.csv ENSG00089 KIZ       5.28   0.4 0.0133      0.004     0.08     0.05 0.0160          1
 6 Documents/mydata/data01.csv ENSG00089 KIZ       5.28   0.4 0.00101     0.004     0.08     0.05 0.00158         1
 7 Documents/mydata/data02.csv ENSG00089 KIZ       5.28   0.4 0.000001    0.004     0.08     0.05 0.000006        1
 8 Documents/mydata/data02.csv ENSG00089 KIZ       5.28   0.4 0.102       0.004     0.08     0.05 0.108           0
 9 Documents/mydata/data02.csv ENSG00089 KIZ       5.28   0.4 0.000155    0.004     0.08     0.05 0.000465        1
10 Documents/mydata/data02.csv ENSG00089 KIZ       5.28   0.4 0.0162      0.004     0.08     0.05 0.0298          1
11 Documents/mydata/data02.csv ENSG00089 KIZ       5.28   0.4 0.0199      0.004     0.08     0.05 0.0298          1
12 Documents/mydata/data02.csv ENSG00089 KIZ       5.28   0.4 0.108       0.004     0.08     0.05 0.108           0

只要用户指向对象,这当然会使分数增加。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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-