如何解决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 举报,一经查实,本站将立刻删除。