Измерьте длину, используя функции Raycast и Triangular, Unity3D - PullRequest
1 голос
/ 17 апреля 2019

Я разрабатываю AR в мобильной среде с использованием Unity.

enter image description here * верх и низ изменились:)

Текущая процедура выглядит следующим образом:

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));

В настоящее время желаемая длина измеряется вышеуказанным методом расчета.Но это не работает должным образом.

То, что я хочу, это длина фиолетового цвета.

Я знаю только звездообразные координаты, наклон камеры,и наклон фиолетовой линии.

Наклон фиолетовой линии такой же, как у камеры.

На рисунке ниже показан случай сбоя.

Я думаю, что чем больше разрыв между красным и желтым лучом, тем больше значение отличается.

Какая часть неверна?

Скажите, как я могу использовать тригонометрическую функцию, чтобы получить длинуфиолетовая линия.

1 Ответ

1 голос
/ 17 апреля 2019

Это может быть легко достигнуто без какой-либо тригонометрии, с помощью класса / структуры Unity Ray, который предлагает удобный метод GetPoint (float distance).Получение расстояния от камеры до ближайшего радиопередачи является тривиальным (. Magnitude), вместо того, чтобы вместо второго радиопередачи, этого достаточно, чтобы создать луч и запросить его для точки на заданном расстоянии.Получение длины фиолетовой линии из вашего примера - это просто вопрос другого .magnitude

    startPos=transform.position;    // to be replaced with camera position
    var hitpoint1=targetA.position; // to be replaced with raycasts hit1
    var hitpoint2=targetB.position; // to be replaced with reaycast hit2
    Ray rayB=new Ray(startPos,hitpoint2-startPos);
    float dist=(hitpoint1-startPos).magnitude;
    var purpleEndPoint=rayB.GetPoint(dist);

    Debug.Log("purple line length ="+(hitpoint1-purpleEndPoint).magnitude);
...