ImaageQ_Unity_App/Assets/Rendering/Scripts/Furniture/FurnitureDragger.cs
Ignacio Gómez Puga 5847d844a5 Removed TOTU 103
2025-03-04 12:04:52 -06:00

90 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
namespace Assets.Scripts.Furniture
{
public class FurnitureDragger : MonoBehaviour
{
private Camera _mainCamera;
private ARRaycastManager _arRaycastManager;
private bool _isDragging;
private bool _isRotating;
private Vector2 _initialTouchPosition;
private float _initialRotation;
private void Start()
{
_mainCamera = Camera.main;
_arRaycastManager = FindFirstObjectByType<ARRaycastManager>();
}
private void Update()
{
if (Input.touchCount == 1)
{
HandleDrag();
}
else if (Input.touchCount == 2)
{
HandleRotate();
}
}
private void HandleRotate()
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
Ray ray = _mainCamera.ScreenPointToRay(touch.position);
if (Physics.Raycast(ray, out RaycastHit hit) && hit.transform == transform)
{
_isDragging = true;
}
}
else if (touch.phase == TouchPhase.Moved && _isDragging)
{
List<ARRaycastHit> hits = new();
if (_arRaycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon))
{
Pose hitPose = hits[0].pose;
transform.position = hitPose.position;
}
}
else if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled) { }
{
_isDragging = false;
}
}
private void HandleDrag()
{
Touch touch1 = Input.GetTouch(0);
Touch touch2 = Input.GetTouch(1);
if (touch1.phase == TouchPhase.Began || touch2.phase == TouchPhase.Began)
{
// Registrar el ángulo inicial para la rotación
Vector2 initialVector = touch2.position - touch1.position;
_initialRotation = Mathf.Atan2(initialVector.y, initialVector.x) * Mathf.Rad2Deg;
}
else if (touch1.phase == TouchPhase.Moved || touch2.phase == TouchPhase.Moved)
{
// Calcular el ángulo actual
Vector2 currentVector = touch2.position - touch1.position;
float currentRotation = Mathf.Atan2(currentVector.y, currentVector.x) * Mathf.Rad2Deg;
// Calcular la diferencia de ángulo y aplicar la rotación
float deltaRotation = currentRotation - _initialRotation;
transform.Rotate(Vector3.up, deltaRotation, Space.World);
// Actualizar el ángulo inicial
_initialRotation = currentRotation;
}
}
}
}