Unidad III: Despliegue y publicación de aplicaciones de RA
El proceso de integración de modelos 2D, 3D, audio y video en la aplicación de RA sigue una secuencia específica para cada tipo de elemento:
| Parámetro | Smartphone | Tablet |
|---|---|---|
| Escala base del modelo | 0.3 - 0.5 | 0.5 - 0.8 |
| Distancia de tracking | 30 - 100 cm | 40 - 150 cm |
| Max polígonos | 50,000 | 100,000 |
| Resolución texturas | 512x512 | 1024x1024 |
| FPS objetivo | 30 fps | 30-60 fps |
El objeto se posiciona en el espacio 3D real usando coordenadas relativas al marcador detectado o a un plano horizontal/vertical. Se usa ARRaycastManager para detectar superficies y anclar objetos.
Tap: Seleccionar objeto / mostrar info.
Drag: Mover objeto en el plano.
Pinch: Escalar (zoom in/out).
Rotate: Dos dedos para rotar.
Detección de planos horizontales (mesas, pisos) y verticales (paredes) usando ARPlaneManager. Los objetos se anclan a superficies detectadas manteniendo su posición en el mundo real.
Uso de GPS + brújula para experiencias de RA geolocalizadas. Activación de contenido AR según la ubicación física del usuario en el campus (geo-anchors).
// ARRaycastManager para detectar superficies
ARRaycastManager raycastManager;
List<ARRaycastHit> hits = new List<ARRaycastHit>();
void Update() {
if (Input.touchCount > 0) {
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began) {
if (raycastManager.Raycast(touch.position, hits,
TrackableTypes.PlaneWithinPolygon)) {
Pose hitPose = hits[0].pose;
Instantiate(prefabModelo, hitPose.position,
hitPose.rotation);
}
}
}
}
void HandlePinchScale() {
if (Input.touchCount == 2) {
Touch t0 = Input.GetTouch(0);
Touch t1 = Input.GetTouch(1);
float prevDist = (
(t0.position - t0.deltaPosition) -
(t1.position - t1.deltaPosition)
).magnitude;
float currDist = (t0.position - t1.position).magnitude;
float scaleFactor = currDist / prevDist;
transform.localScale *= scaleFactor;
float clampedScale = Mathf.Clamp(
transform.localScale.x, 0.1f, 3.0f);
transform.localScale = Vector3.one * clampedScale;
}
}
public class MarkerHandler :
MonoBehaviour, ITrackableEventHandler
{
void OnTrackingFound() {
modelo3D.SetActive(true);
audioSource.Play();
modelo3D.transform.localPosition =
new Vector3(0, 0.1f, 0);
modelo3D.transform.localScale =
Vector3.one * 0.5f;
}
void OnTrackingLost() {
modelo3D.SetActive(false);
audioSource.Stop();
}
}
void HandleTwoFingerRotation() {
if (Input.touchCount == 2) {
Touch t0 = Input.GetTouch(0);
Touch t1 = Input.GetTouch(1);
Vector2 prevDir = (t0.position - t0.deltaPosition)
- (t1.position - t1.deltaPosition);
Vector2 currDir = t0.position - t1.position;
float angle = Vector2.SignedAngle(prevDir, currDir);
transform.Rotate(Vector3.up, angle);
}
}
| Plataforma | SDK/Framework | Requisito | Tienda |
|---|---|---|---|
| Android | ARCore | Android 7.0+ | Google Play Store |
| iOS | ARKit | iPhone 6s+, iOS 11+ | App Store |
| Web (WebXR) | AR.js / Three.js / 8th Wall | Chrome, Safari | URL directa |
| HoloLens | MRTK | HoloLens 2 | Microsoft Store |
| Meta Quest | Passthrough API + Unity | Quest 3 / Pro | Meta Quest Store |
| Snapchat | Lens Studio | Snapchat app | Lens Explorer |
| Instagram/FB | Spark AR Studio | IG/FB app | Spark AR Hub |