Рассчитать глубину вдавливания в модели с использованием трехточечной системы? - PullRequest
0 голосов
/ 10 января 2019

С помощью Raycasting можно выбрать точку на GameObjects Collider. На коротком визуальном изображении три точки представлены маленькими сферами, обозначающими выбор пользователя. Желание состоит в том, чтобы рассчитать глубину любого пятна в модели отступов. В настоящее время предполагается использовать систему, в которой пользователь выбирает две точки за пределами глубины и точку в пределах глубины отступа, чем рассчитывает глубину углублений.

Доступная нам информация - это три точки (Векторы) в пространстве, расстояние между ними и любая другая векторная математика, использующая три точки. Как мы используем вышеупомянутые данные для вычисления глубины нашего отступа? Возможен ли и разумный подход для расчета точки, перпендикулярной точке в глубине? Мысль о том, что если эта точка рассчитывается, чем глубина, будет расстояние между этими двумя точками. Как это сделать, возможно ли это, возможно, есть лучший подход?

short_visual

indenttest_003_A indenttest_003_B

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Чтобы дополнить ответ Рузима, как я указывал в предыдущем вопросе , вам действительно нужно 4 (3 + 1) балла. 3 (2 + 1) балла по-прежнему недостаточно. Возвращаясь к моему предыдущему примеру, предположим, что одна точка на плоскости поверхности a равна A равна (0,0,0), другая B равна (0,0,1), а точка на плоскости отступа b равна I (2,1,0). Насколько глубокий отступ? Ответ: вы все еще не знаете. При добавлении точки B все еще остаются действительные два варианта из этого примера:

  • a равно X = 0, а b равно X = 2. Тогда глубина отступа составляет 2 *. 1018 *
  • a равно Y = 0, а b равно Y = 1. Тогда глубина отступа равна 1.

И есть еще бесконечно много других вариантов.

Это происходит потому, что две точки (A и B) фиксируют только линию, а не всю плоскость. Чтобы исправить самолет, вам действительно нужно 3 точки (не лежа на одной линии). И это то, что делает ответы Рузима.

0 голосов
/ 10 января 2019

Это довольно открытый вопрос, потому что просто «глубина» довольно расплывчата. Вот два подхода, если вы можете найти некоторые точки на модели в мировом пространстве:

Метод 1: создание базовой плоскости из 3 точек на поверхности.

  1. Попросите пользователя щелкнуть точку, "глубину" которой он хочет знать.

    RaycastHit indentHit;
    Vector3 depthPoint = indentHit.point;
    
  2. Пользователь должен щелкнуть три точки за пределами «отступа». Эти три точки определяют плоскость, которую мы будем использовать в качестве эталона для нашего измерения "глубины".

    RaycastHit hitA;
    RaycastHit hitB;
    RaycastHit hitC;
    
    Vector3 a = hitA.point;
    Vector3 b = hitB.point;
    Vector3 c = hitC.point; 
    
    Plane surfacePlane = new Plane(a, b, c); 
    
  3. Найдите расстояние от плоскости до точки, используя Plane.GetDistanceToPoint. Нас не волнует направление, только расстояние, поэтому мы используем Mathf.Abs, чтобы убедиться, что наше расстояние положительное:

    float depth = Mathf.Abs(surfacePlane.GetDistanceToPoint(depthPoint));
    

Метод 2: Создание базовой плоскости из 1 точки на поверхности и ее нормали.

Еще один способ сделать это - взять одну точку на поверхности модели и одну точку на отступе, создать плоскость из одной точки на поверхности модели и использовать ее нормаль для создания плоскости. из этой одной точки:

  1. Попросите пользователя щелкнуть точку, "глубину" которой он хочет знать.

    RaycastHit indentHit;
    Vector3 depthPoint = indentHit.point;
    
  2. Попросите пользователя щелкнуть одну точку за пределами «отступа». Затем найдите нормальное в этой точке. Из них вы можете создать плоскость.

    RaycastHit surfaceHit;
    Vector3 surfacePoint = surfaceHit.point;
    Vector3 surfaceNormal = surfaceHit.normal;
    
    Plane surfacePlane = new Plane(surfaceNormal.normalized, surfacePoint);
    

    Что-то, что может стоить попробовать, - это возможность взять несколько точек и нормалей и усреднить их, чтобы создать плоскость. Если вы попробуете это, просто убедитесь, что вы получили normalized форму нормального.

  3. Найдите расстояние от плоскости до точки, используя Plane.GetDistanceToPoint. Нас не волнует направление, только расстояние, поэтому мы используем Mathf.Abs, чтобы убедиться, что наше расстояние положительное:

    float depth = Mathf.Abs(surfacePlane.GetDistanceToPoint(depthPoint));
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...