Codecamp Iași, Spring 2019
Dragoș Silion
(Q1 of 2018)
Also works on Android, iOS, React Native and (soon?) on web
IMU
Camera Feed
Feature Points
Camera Pose
Env. Mapping
SLAM - Simulatenously Location and Mapping
AR Session
AR Frames
Trackables
Camera feed
Camera Pose
Light Estimation
etc.
Dynamic Data
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;
if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
if ((hit.Trackable is DetectedPlane) &&
Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
hit.Pose.rotation * Vector3.up) < 0)
{
Debug.Log("Hit at back of the current DetectedPlane");
}
else
{
GameObject prefab;
if (hit.Trackable is FeaturePoint)
{
prefab = AndyPointPrefab;
}
else
{
prefab = AndyPlanePrefab;
}
var andyObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);
andyObject.transform.Rotate(0, k_ModelRotation, 0, Space.Self);
var anchor = hit.Trackable.CreateAnchor(hit.Pose);
andyObject.transform.parent = anchor.transform;
}
}TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;
if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
if ((hit.Trackable is DetectedPlane) &&
Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
hit.Pose.rotation * Vector3.up) < 0)
{
Debug.Log("Hit at back of the current DetectedPlane");
}
else
{
GameObject prefab;
if (hit.Trackable is FeaturePoint)
{
prefab = AndyPointPrefab;
}
else
{
prefab = AndyPlanePrefab;
}
var andyObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);
andyObject.transform.Rotate(0, k_ModelRotation, 0, Space.Self);
var anchor = hit.Trackable.CreateAnchor(hit.Pose);
andyObject.transform.parent = anchor.transform;
}
}TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;
if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
if ((hit.Trackable is DetectedPlane) &&
Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
hit.Pose.rotation * Vector3.up) < 0)
{
Debug.Log("Hit at back of the current DetectedPlane");
}
else
{
GameObject prefab;
if (hit.Trackable is FeaturePoint)
{
prefab = AndyPointPrefab;
}
else
{
prefab = AndyPlanePrefab;
}
var andyObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);
andyObject.transform.Rotate(0, k_ModelRotation, 0, Space.Self);
var anchor = hit.Trackable.CreateAnchor(hit.Pose);
andyObject.transform.parent = anchor.transform;
}
}// Get updated augmented images for this frame.
Session.GetTrackables<AugmentedImage>(
m_TempAugmentedImages, TrackableQueryFilter.Updated);
// Create visualizers and anchors for updated augmented images that are tracking and do
// not previously have a visualizer. Remove visualizers for stopped images.
foreach (var image in m_TempAugmentedImages)
{
AugmentedImageVisualizer visualizer = null;
m_Visualizers.TryGetValue(image.DatabaseIndex, out visualizer);
if (image.TrackingState == TrackingState.Tracking && visualizer == null)
{
// Create an anchor to ensure that ARCore keeps tracking this augmented image.
Anchor anchor = image.CreateAnchor(image.CenterPose);
visualizer = (AugmentedImageVisualizer)Instantiate(
AugmentedImageVisualizerPrefab, anchor.transform);
visualizer.Image = image;
m_Visualizers.Add(image.DatabaseIndex, visualizer);
}
else if (image.TrackingState == TrackingState.Stopped && visualizer != null)
{
m_Visualizers.Remove(image.DatabaseIndex);
GameObject.Destroy(visualizer.gameObject);
}
}if (Image == null || Image.TrackingState != TrackingState.Tracking)
{
FrameLowerLeft.SetActive(false);
FrameLowerRight.SetActive(false);
FrameUpperLeft.SetActive(false);
FrameUpperRight.SetActive(false);
return;
}
float halfWidth = Image.ExtentX / 2;
float halfHeight = Image.ExtentZ / 2;
FrameLowerLeft.transform.localPosition =
(halfWidth * Vector3.left) + (halfHeight * Vector3.back);
FrameLowerRight.transform.localPosition =
(halfWidth * Vector3.right) + (halfHeight * Vector3.back);
FrameUpperLeft.transform.localPosition =
(halfWidth * Vector3.left) + (halfHeight * Vector3.forward);
FrameUpperRight.transform.localPosition =
(halfWidth * Vector3.right) + (halfHeight * Vector3.forward);
FrameLowerLeft.SetActive(true);
FrameLowerRight.SetActive(true);
FrameUpperLeft.SetActive(true);
FrameUpperRight.SetActive(true);(over ARCore/ARKit)
Vuforia - Same feature, more stable over ARCore + New Features
(over ARCore/ARKit)
Azure cloud anchors
(over ARCore/ARKit)
LENS STUDIO
(over ARCore/ARKit)
LENS STUDIO
(over ARCore/ARKit)
6d.ai
(over ARCore/ARKit)
And other crazy stuff (Posemoji)
(TBD)
Dragoș Silion
twitter - @silidragos
dragos@colorfulcoding.com
Please help me with some honest feedback 👍👎: