Я разрабатываю AR в мобильной среде с использованием Unity.
* верх и низ изменились:)
Текущая процедура выглядит следующим образом:
1.Измерьте уклон мобильного устройства.
float angle = Camera.main.transform.eulerAngles.x * Mathf.Deg2Rad;
2.Снимите Луч к поверхности в двух точках на экране мобильного телефона (вверху, внизу)
Координаты x двух точек одинаковы
Координаты y - это верхняя часть, а меньшая - это нижняя.
Vector3 Top = hitTop.Pose.position;
Vector3 Bottom = hitBottom.Pose.position;
3.Измерьте разницу в высоте между мобильным устройством и его поверхностью (ось Y)
Vector3 CameraPoint = Camera.main.transform.position;
Vector3 SurfacePoint = new Vector3(CameraPoint.x, Bottom.y, CameraPoint.z);
float H = CameraPoint.y - SurfacePoint.y;
4.Измерьте длину по горизонтали, чтобы воспользоваться пропорциональным выражением.
float W = Vector3.Distance(Top, SurfacePoint);
float w = Vector3.Distance(Top, Bottom);
5.Используя пропорциональное выражение, вычислите высоту маленького треугольника.
H: W = h: w => H * w = W * h => ∴ h = (H * w) / Ш
float h = ((H * w) / W);
6.С помощью двух линий (h, w) и наклона камеры я хочу измерить длину фиолетовой линии.
Интерпретировать эту проблему как плоскость координат, иСоздайте выражение на гипотенузе
x / w + y / h = 1
Используя прямой наклон, получите выражение для прямой линии.
y = tan (90-θ) x
Эти два выражения следующие:
x= 1 / (1 / w + загар (90-θ) / ч)
y = загар (90-θ) / (1 / w + загар (90-θ) / ч)
7.Чтобы предотвратить бесконечное число, tanθ было изменено на cosθ, sinθ.
* tanθ = sinθ / cosθ
* tan(90 - θ) = cosθ / sinθ
x = 1 / (1 / w + cosθ / (h * sinθ))
y = (cosθ / sinθ) / (1 / w + cosθ / (h * sinθ))
8.Я сделал простое изменение, потому что выражение слишком сложное.
var x = (h * w * Mathf.Sin(angle)) / (h * Mathf.Sin(angle) + w * Mathf.Cos(angle));
var y = (h * w * Mathf.Cos(angle)) / (h * Mathf.Sin(angle) + w * Mathf.Cos(angle));
9.Я измерил расстояние (0,0), (x, y)
float Object_height = Vector2.Distance(Vector2.zero, new Vector2(x, y));
В настоящее время желаемая длина измеряется вышеуказанным методом расчета.Но это не работает должным образом.
То, что я хочу, это длина фиолетового цвета.
Я знаю только звездообразные координаты, наклон камеры,и наклон фиолетовой линии.
Наклон фиолетовой линии такой же, как у камеры.
На рисунке ниже показан случай сбоя.
Я думаю, что чем больше разрыв между красным и желтым лучом, тем больше значение отличается.
Какая часть неверна?
Скажите, как я могу использовать тригонометрическую функцию, чтобы получить длинуфиолетовая линия.