diff --git a/app/src/main/assets/models/andy.mtl b/app/src/main/assets/models/andy.mtl new file mode 100644 index 0000000..943bf19 --- /dev/null +++ b/app/src/main/assets/models/andy.mtl @@ -0,0 +1,7 @@ +newmtl andy +Ka 0.00000 0.00000 0.00000 +Kd 2.00000 2.00000 2.00000 +Ks 0.50000 0.50000 0.50000 +Ns 6.00000 +map_Kd andy.png + diff --git a/app/src/main/assets/models/andy.obj b/app/src/main/assets/models/andy.obj index 9097dea..025cf38 100644 --- a/app/src/main/assets/models/andy.obj +++ b/app/src/main/assets/models/andy.obj @@ -1,5 +1,7 @@ # This file uses centimeters as units for non-parametric coordinates. +mtllib andy.mtl + g default v 0.036531 0.203676 -0.001768 v 0.035000 0.204560 -0.002500 @@ -3739,6 +3741,7 @@ vn -0.000000 1.000000 0.000000 s 1 g Andy_GEO +usemtl andy f 1/1/1 2/2/2 10/10/3 9/9/4 f 2/2/2 3/3/5 11/11/6 10/10/3 f 3/3/5 4/4/7 12/927/8 11/11/6 diff --git a/app/src/main/java/com/google/ar/core/examples/java/common/framework/RWT/RWTRenderer.java b/app/src/main/java/com/google/ar/core/examples/java/common/framework/RWT/RWTRenderer.java index 2bd5d1d..dbe10e2 100644 --- a/app/src/main/java/com/google/ar/core/examples/java/common/framework/RWT/RWTRenderer.java +++ b/app/src/main/java/com/google/ar/core/examples/java/common/framework/RWT/RWTRenderer.java @@ -97,7 +97,6 @@ // Frameの取得 session.setCameraTextureName(backgroundRenderer.getTextureId()); Frame frame = session.update(); - // 背景(カメラ映像)の描画 backgroundRenderer.draw(gl, frame); diff --git a/app/src/main/java/com/google/ar/core/examples/java/common/framework/view3D/Viewer3D.java b/app/src/main/java/com/google/ar/core/examples/java/common/framework/view3D/Viewer3D.java index 0497ec2..d25694f 100644 --- a/app/src/main/java/com/google/ar/core/examples/java/common/framework/view3D/Viewer3D.java +++ b/app/src/main/java/com/google/ar/core/examples/java/common/framework/view3D/Viewer3D.java @@ -36,7 +36,9 @@ if (camera != null) { float focalLength = camera.getImageIntrinsics().getFocalLength()[0]; // gc3D.update(width, height, (float)camera.getFieldOfView(), (float)camera.getFrontClipDistance(), (float)camera.getBackClipDistance(), false); - gc3D.update(width, height, (float) Math.atan(width / 2.0f / focalLength) * 2.0f, 0.1f, 100.0f, false); + float w = (float)camera.getImageIntrinsics().getImageDimensions()[1]; +// height = camera.getImageIntrinsics().getImageDimensions()[0]; + gc3D.update(this.width, this.height, (float) Math.atan(w / 2.0f / focalLength) * 2.0f, 0.1f, 100.0f, false); } } @@ -51,14 +53,15 @@ // カメラの更新 this.camera = camera; if (camera != null) { - float viewPoint[] = camera.getPose().getTranslation(); - float viewLine[] = camera.getPose().getZAxis(); - float viewUp[] = camera.getPose().getYAxis(); + float viewPoint[] = camera.getDisplayOrientedPose().getTranslation(); + float viewLine[] = camera.getDisplayOrientedPose().getZAxis(); + float viewUp[] = camera.getDisplayOrientedPose().getYAxis(); float focalLength = camera.getImageIntrinsics().getFocalLength()[0]; Position3D eye = new Position3D(viewPoint[0], viewPoint[1], viewPoint[2]); Position3D center = eye.clone().add(new Vector3d(-viewLine[0], -viewLine[1], -viewLine[2])); - Vector3d up = new Vector3d(viewUp[0], viewUp[1], viewUp[2]); - gc3D.update(width, height, (float) Math.atan((float) width / 2.0f / focalLength) * 2.0f, 0.1f, 100.0f, eye, center, up, false); + Vector3d up = new Vector3d(viewUp[0], viewUp[1] * camera.getPose().qy(), viewUp[2]); + float w = (float)camera.getImageIntrinsics().getImageDimensions()[1]; + gc3D.update(width, height, (float) Math.atan(w / 2.0f / focalLength) * 2.0f, 0.1f, 100.0f, eye, center, up, false); } } diff --git a/app/src/main/java/com/google/ar/core/examples/java/common/rendering/PointCloudRenderer.java b/app/src/main/java/com/google/ar/core/examples/java/common/rendering/PointCloudRenderer.java index fb02149..d9743a6 100644 --- a/app/src/main/java/com/google/ar/core/examples/java/common/rendering/PointCloudRenderer.java +++ b/app/src/main/java/com/google/ar/core/examples/java/common/rendering/PointCloudRenderer.java @@ -21,6 +21,8 @@ import com.google.ar.core.PointCloud; import java.io.IOException; +import javax.microedition.khronos.opengles.GL10; + /** Renders a point cloud. */ public class PointCloudRenderer { private static final String TAG = PointCloud.class.getSimpleName(); diff --git a/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java b/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java index b9d2c3f..9c57b18 100644 --- a/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java +++ b/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java @@ -36,6 +36,10 @@ import com.google.ar.core.Trackable; import com.google.ar.core.TrackingState; import com.google.ar.core.examples.java.common.framework.RWT.RWTRenderer; +import com.google.ar.core.examples.java.common.framework.model3D.ModelFactory; +import com.google.ar.core.examples.java.common.framework.model3D.ModelFileFormatException; +import com.google.ar.core.examples.java.common.framework.model3D.Object3D; +import com.google.ar.core.examples.java.common.framework.model3D.Position3D; import com.google.ar.core.examples.java.common.framework.model3D.Universe; import com.google.ar.core.examples.java.common.helpers.CameraPermissionHelper; import com.google.ar.core.examples.java.common.helpers.DisplayRotationHelper; @@ -43,6 +47,8 @@ import com.google.ar.core.examples.java.common.helpers.SnackbarHelper; import com.google.ar.core.examples.java.common.helpers.TapHelper; import com.google.ar.core.examples.java.common.helpers.TrackingStateHelper; +import com.google.ar.core.examples.java.common.java3d.Appearance; +import com.google.ar.core.examples.java.common.java3d.Material; import com.google.ar.core.examples.java.common.rendering.BackgroundRenderer; import com.google.ar.core.examples.java.common.rendering.ObjectRenderer; import com.google.ar.core.examples.java.common.rendering.ObjectRenderer.BlendMode; @@ -105,6 +111,11 @@ private final ArrayList anchors = new ArrayList<>(); + private float ambient = 0.3f; + private float diffuse = 1.0f; + private float specular = 1.0f; + private float specularPower = 6.0f; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -129,6 +140,15 @@ surfaceView.setWillNotDraw(false); installRequested = false; + try { + Object3D andy = ModelFactory.loadModel(getResources(), "models/andy.obj", null).createObject(); + andy.setPosition(new Position3D(0.0, 0.0, -1.0)); + universe.place(andy); + } catch (IOException e) { + e.printStackTrace(); + } catch (ModelFileFormatException e) { + e.printStackTrace(); + } } @Override @@ -290,7 +310,7 @@ // If not tracking, don't draw 3D objects, show tracking failure reason instead. if (camera.getTrackingState() == TrackingState.PAUSED) { messageSnackbarHelper.showMessage( - this, TrackingStateHelper.getTrackingFailureReasonString(camera)); + this, TrackingStateHelper.getTrackingFailureReasonString(camera)); return; } @@ -326,12 +346,12 @@ // planeRenderer.drawPlanes( // session.getAllTrackables(Plane.class), camera.getDisplayOrientedPose(), projmtx); // -// // Visualize anchors created by touch. -// float scaleFactor = 1.0f; -// for (ColoredAnchor coloredAnchor : anchors) { -// if (coloredAnchor.anchor.getTrackingState() != TrackingState.TRACKING) { -// continue; -// } + // Visualize anchors created by touch. +// float scaleFactor = 1.0f; +// for (ColoredAnchor coloredAnchor : anchors) { +// if (coloredAnchor.anchor.getTrackingState() != TrackingState.TRACKING) { +// continue; +// } // // Get the current pose of an Anchor in world space. The Anchor pose is updated // // during calls to session.update() as ARCore refines its estimate of the world. // coloredAnchor.anchor.getPose().toMatrix(anchorMatrix, 0); @@ -344,12 +364,13 @@ // // } - } catch (Throwable t) { - // Avoid crashing the application due to unhandled exceptions. - Log.e(TAG, "Exception on the OpenGL thread", t); - } + } catch(Throwable t){ + // Avoid crashing the application due to unhandled exceptions. + Log.e(TAG, "Exception on the OpenGL thread", t); + } } + // Handle only one tap per frame, as taps are usually low frequency compared to frame rate. private void handleTap(Frame frame, Camera camera) { MotionEvent tap = tapHelper.poll(); @@ -387,7 +408,21 @@ // Adding an Anchor tells ARCore that it should track this position in // space. This anchor is created on the Plane to place the 3D model // in the correct position relative both to the world and to the plane. - anchors.add(new ColoredAnchor(hit.createAnchor(), objColor)); + ColoredAnchor anchor = new ColoredAnchor(hit.createAnchor(), objColor); + anchors.add(anchor); + double px = anchor.anchor.getPose().tx(); + double py = anchor.anchor.getPose().ty(); + double pz = anchor.anchor.getPose().tz(); + + try { + Object3D andy = ModelFactory.loadModel(getResources(), "models/andy.obj", null).createObject(); + andy.setPosition(new Position3D(px, py, pz)); + universe.place(andy); + } catch (IOException e) { + e.printStackTrace(); + } catch (ModelFileFormatException e) { + e.printStackTrace(); + } break; } }