Unity3D — получить математическую плоскость из примитивной плоскости в той же мировой позиции

У меня есть GameObject.Plane в заданной позиции для визуальных целей. Исходя из этого, учитывая вращение и положение самолета в мировом пространстве, я должен сделать математическую плоскость для использования в следующих расчетах, но что-то не так.

я пытался сделать

new Plane(go.transform.InverseTransformDirection(-go.transform.right), go.transform.InverseTransformPoint(go.transform.position));

где go – примитивный плоский объект. Его положение в мировом пространстве кажется хорошим, судя по более поздним результатам, но вращение - нет.

Примитивная плоскость (go) повернута на 90 градусов, поэтому вместо того, чтобы смотреть вверх, она смотрит в сторону.

Что здесь не так?

Изменить. Текущая настройка

go.transform.InverseTransformDirection(-go.transform.right);
return new Plane(go.transform.up, go.transform.position);

void OnDrawGizmos()
{
    Gizmos.color = Color.magenta; 
    Gizmos.DrawLine(planePrimitive.transform.position, planePrimitive.transform.position + plane.normal * 3f);      
}

person Mads M    schedule 30.08.2019    source источник


Ответы (1)


Этот

go.transform.InverseTransformDirection(-go.transform.right)

возвращает вектор, обращенный в сторону, и вы используете его как Plane normal.


Нормаль примитивного Plane объекта — это просто его локальный transform.up вектор.

Затем обратите внимание, что Plane принимает координаты мирового пространства, поэтому нет смысла использовать InverseTransformDirection и InverseTransformPoint, поскольку transform.up и transform.position уже находятся в мировом пространстве.

new Plane(go.transform.up, go.transform.position);

Если вы скорее говорите о примитивном объекте Quad, то вам нужен вектор -transform.forward.

new Plane(-go.transform.forward, go.transform.position);

К вашим штуковинам:

Вы используете testPlane.normal, как будто это позиция. Нет, это не так! Нормаль является направлением и ничего не говорит о позиции.

То, что вы хотите сделать, было бы, например. (без использования локальных космических штуковин)

Gizmos.DrawLine(go.transform.position, go.transform.position + testPlane.normal * 3f);

или если можно полагаться только на сам самолет пользуйся

Gizmos.DrawLine(plane.distance, plane.distance + testPlane.normal * 3f);

На этой второй плоскости plane.distance — это вектор от 0,0,0 до ближайшей точки плоскости. Следовательно, он все еще не будет точно в положении данного плоского объекта.

person derHugo    schedule 30.08.2019
comment
Спасибо. Для пояснения я использую PrimitiveType.Plane. Я использую линию Gizmos, чтобы показать нормаль математической плоскости, и она обращена в правильном направлении, хотя ее положение смещено от того места, где оно должно быть. Таким образом, он интерпретируется как непересекающийся. Для справки, примитивная плоскость вложена во многие другие игровые объекты, расположенные не по центру, и кажется, что математическая плоскость находится в центре (судя по положению линии гизмо, которое может быть неверным). - person Mads M; 30.08.2019
comment
Я не вижу вашего рисунка Gizmos ... Plane бесконечно большой, поскольку это чисто математическая конструкция ... на самом деле у него нет центра или положения, поэтому я думаю, что Unity просто использует 0,0,0 ... Однако вы знаете, что вы можно также рисовать вещицы в локальном пространстве, верно? - person derHugo; 30.08.2019
comment
Эти местные космические штуковины потрясающие. Теперь он на самом деле рисует в нужном месте, используя положение примитива и нормаль плоскости в качестве направления. Хотя плоскость все равно почему-то видится непересекающейся. Его положение должно быть выключено? - person Mads M; 30.08.2019
comment
Спасибо, Gizmos починили. Он рисуется из центра примитивной плоскости, указывая в правильном направлении, никаких странных смещений. (Математическая) плоскость передается в функцию, которая проверяет, пересекается ли она с другой сеткой, и говорит, что не пересекается. Раньше это срабатывало из-за отчаянных попыток изменить некоторые переменные здесь и там, поэтому я знаю, что это не вина этой функции. Почему самолет не распознается в этом положении? - person Mads M; 30.08.2019