Open umairabbasi12 opened 6 years ago
package com.example.umair.dragfinal;
import android.net.Uri; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout;
import com.google.ar.core.Anchor; import com.google.ar.core.Frame; import com.google.ar.core.HitResult; import com.google.ar.core.Plane; import com.google.ar.core.Trackable; import com.google.ar.core.TrackingState; import com.google.ar.sceneform.AnchorNode; import com.google.ar.sceneform.rendering.ModelRenderable; import com.google.ar.sceneform.rendering.Renderable; import com.google.ar.sceneform.ux.ArFragment; import com.google.ar.sceneform.ux.TransformableNode;
import java.util.List; import java.util.concurrent.CompletableFuture;
public class MainActivity extends AppCompatActivity { private ArFragment fragment; private PointerDrawable pointer = new PointerDrawable(); private boolean isTracking; private boolean isHitting;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.sceneform_fragment);
fragment.getArSceneView().getScene().addOnUpdateListener(frameTime -> { fragment.onUpdate(frameTime); onUpdate(); }); initializeGallery();
}
private void onUpdate() { boolean trackingChanged = updateTracking(); View contentView = findViewById(android.R.id.content); if (trackingChanged) { if (isTracking) { contentView.getOverlay().add(pointer); } else { contentView.getOverlay().remove(pointer); } contentView.invalidate(); }
if (isTracking) { boolean hitTestChanged = updateHitTest(); if (hitTestChanged) { pointer.setEnabled(isHitting); contentView.invalidate(); } }
} private boolean updateTracking() { Frame frame = fragment.getArSceneView().getArFrame(); boolean wasTracking = isTracking; isTracking = frame != null && frame.getCamera().getTrackingState() == TrackingState.TRACKING; return isTracking != wasTracking; } private boolean updateHitTest() { Frame frame = fragment.getArSceneView().getArFrame(); android.graphics.Point pt = getScreenCenter(); List hits; boolean wasHitting = isHitting; isHitting = false; if (frame != null) { hits = frame.hitTest(pt.x, pt.y); for (HitResult hit : hits) { Trackable trackable = hit.getTrackable(); if (trackable instanceof Plane && ((Plane) trackable).isPoseInPolygon(hit.getHitPose())) { isHitting = true; break; } } } return wasHitting != isHitting; }
private android.graphics.Point getScreenCenter() { View vw = findViewById(android.R.id.content); return new android.graphics.Point(vw.getWidth()/2, vw.getHeight()/2); } private void initializeGallery() { LinearLayout gallery = findViewById(R.id.gallery_layout);
ImageView andy = new ImageView(this); andy.setImageResource(R.drawable.droid_thumb); andy.setContentDescription("andy"); andy.setOnClickListener(view ->{addObject(Uri.parse("andy.sfb"));}); gallery.addView(andy); ImageView cabin = new ImageView(this); cabin.setImageResource(R.drawable.cabin_thumb); cabin.setContentDescription("cabin"); cabin.setOnClickListener(view ->{addObject(Uri.parse("Cabin.sfb"));}); gallery.addView(cabin); ImageView house = new ImageView(this); house.setImageResource(R.drawable.house_thumb); house.setContentDescription("house"); house.setOnClickListener(view ->{addObject(Uri.parse("House.sfb"));}); gallery.addView(house); ImageView igloo = new ImageView(this); igloo.setImageResource(R.drawable.igloo_thumb); igloo.setContentDescription("igloo"); igloo.setOnClickListener(view ->{addObject(Uri.parse("igloo.sfb"));}); gallery.addView(igloo);
} //Add the addObject method private void addObject(Uri model) { Frame frame = fragment.getArSceneView().getArFrame(); android.graphics.Point pt = getScreenCenter(); List hits; if (frame != null) { hits = frame.hitTest(pt.x, pt.y); for (HitResult hit : hits) { Trackable trackable = hit.getTrackable(); if (trackable instanceof Plane && ((Plane) trackable).isPoseInPolygon(hit.getHitPose())) { placeObject(fragment, hit.createAnchor(), model); break;
} } }
} //Add placeObject method private void placeObject(ArFragment fragment, Anchor anchor, Uri model) { CompletableFuture renderableFuture = ModelRenderable.builder() .setSource(fragment.getContext(), model) .build() .thenAccept(renderable -> addNodeToScene(fragment, anchor, renderable)) .exceptionally((throwable -> { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(throwable.getMessage()) .setTitle("Codelab error!"); AlertDialog dialog = builder.create(); dialog.show(); return null; })); } //add obj private void addNodeToScene(ArFragment fragment, Anchor anchor, Renderable renderable) { AnchorNode anchorNode = new AnchorNode(anchor); TransformableNode node = new TransformableNode(fragment.getTransformationSystem()); node.setRenderable(renderable); node.setParent(anchorNode); fragment.getArSceneView().getScene().addChild(anchorNode); node.select(); } } null pointer execption are Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.ar.sceneform.ArSceneView com.google.ar.sceneform.ux.ArFragment.getArSceneView()' on a null object reference at com.example.umair.dragfinal.MainActivity.onCreate(MainActivity.java:39)
Perhaps fragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.sceneform_fragment);
returned null. Was it added to a layout file?
package com.example.umair.dragfinal;
import android.net.Uri; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout;
import com.google.ar.core.Anchor; import com.google.ar.core.Frame; import com.google.ar.core.HitResult; import com.google.ar.core.Plane; import com.google.ar.core.Trackable; import com.google.ar.core.TrackingState; import com.google.ar.sceneform.AnchorNode; import com.google.ar.sceneform.rendering.ModelRenderable; import com.google.ar.sceneform.rendering.Renderable; import com.google.ar.sceneform.ux.ArFragment; import com.google.ar.sceneform.ux.TransformableNode;
import java.util.List; import java.util.concurrent.CompletableFuture;
public class MainActivity extends AppCompatActivity { private ArFragment fragment; private PointerDrawable pointer = new PointerDrawable(); private boolean isTracking; private boolean isHitting;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.sceneform_fragment);
}
private void onUpdate() { boolean trackingChanged = updateTracking(); View contentView = findViewById(android.R.id.content); if (trackingChanged) { if (isTracking) { contentView.getOverlay().add(pointer); } else { contentView.getOverlay().remove(pointer); } contentView.invalidate(); }
} private boolean updateTracking() { Frame frame = fragment.getArSceneView().getArFrame(); boolean wasTracking = isTracking; isTracking = frame != null && frame.getCamera().getTrackingState() == TrackingState.TRACKING; return isTracking != wasTracking; } private boolean updateHitTest() { Frame frame = fragment.getArSceneView().getArFrame(); android.graphics.Point pt = getScreenCenter(); List hits;
boolean wasHitting = isHitting;
isHitting = false;
if (frame != null) {
hits = frame.hitTest(pt.x, pt.y);
for (HitResult hit : hits) {
Trackable trackable = hit.getTrackable();
if (trackable instanceof Plane &&
((Plane) trackable).isPoseInPolygon(hit.getHitPose())) {
isHitting = true;
break;
}
}
}
return wasHitting != isHitting;
}
private android.graphics.Point getScreenCenter() { View vw = findViewById(android.R.id.content); return new android.graphics.Point(vw.getWidth()/2, vw.getHeight()/2); } private void initializeGallery() { LinearLayout gallery = findViewById(R.id.gallery_layout);
} //Add the addObject method private void addObject(Uri model) { Frame frame = fragment.getArSceneView().getArFrame(); android.graphics.Point pt = getScreenCenter(); List hits;
if (frame != null) {
hits = frame.hitTest(pt.x, pt.y);
for (HitResult hit : hits) {
Trackable trackable = hit.getTrackable();
if (trackable instanceof Plane &&
((Plane) trackable).isPoseInPolygon(hit.getHitPose())) {
placeObject(fragment, hit.createAnchor(), model);
break;
} //Add placeObject method private void placeObject(ArFragment fragment, Anchor anchor, Uri model) { CompletableFuture renderableFuture =
ModelRenderable.builder()
.setSource(fragment.getContext(), model)
.build()
.thenAccept(renderable -> addNodeToScene(fragment, anchor, renderable))
.exceptionally((throwable -> {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(throwable.getMessage())
.setTitle("Codelab error!");
AlertDialog dialog = builder.create();
dialog.show();
return null;
}));
}
//add obj
private void addNodeToScene(ArFragment fragment, Anchor anchor, Renderable renderable) {
AnchorNode anchorNode = new AnchorNode(anchor);
TransformableNode node = new TransformableNode(fragment.getTransformationSystem());
node.setRenderable(renderable);
node.setParent(anchorNode);
fragment.getArSceneView().getScene().addChild(anchorNode);
node.select();
}
}
null pointer execption are
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.ar.sceneform.ArSceneView com.google.ar.sceneform.ux.ArFragment.getArSceneView()' on a null object reference
at com.example.umair.dragfinal.MainActivity.onCreate(MainActivity.java:39)