Помогите построить OBB, пытаясь изобразить матрицу с 3 векторами - PullRequest
1 голос
/ 19 августа 2009

В настоящее время я пытаюсь создать OBB (Ориентирующая ограничивающая рамка) с использованием источника и математических данных, содержащихся в книге "Обнаружение столкновений в реальном времени".

Одна проблема с кодом, содержащимся в этой книге, заключается в том, что он очень мало объясняет, что параметры означают для методов.

Я пытаюсь выяснить, что мне нужно для подачи моего метода setOBB () (я написал этот). Это выглядит так:

void PhysicalObject::setOBB( Ogre::Vector3 centrePoint, Ogre::Vector3 localAxes[3], Ogre::Vector3 positiveHalfwidthExtents )
{
    // Ogre::Vector3    c;      // OBB center point
    // Ogre::Vector3    u[3];   // Local x-, y-, and z-axes (rotation matrix)
    // Ogre::Vector3    e;  // Positive halfwidth extents of OBB along each axis

    m_obb.c         = centrePoint;
    m_obb.u[0]      = localAxes[0];
    m_obb.u[1]      = localAxes[1];
    m_obb.u[2]      = localAxes[2];
    m_obb.e         = positiveHalfwidthExtents;
}

Глядя на требуемые параметры, первый и третий параметры, я думаю, я понимаю.

  1. Пройдите в центральное положение объекта.
  2. Это моя проблема. Я полагаю, что ей нужна матрица, представленная с использованием массива из 3 векторов? а как?
  3. Вектор, который содержит величину для расстояния между центральной точкой и краем OBB в каждом направлении x, y, z.

Вот что я сейчас делаю:

// Build the OBB
Ogre::Vector3 rotation[3];
Ogre::Vector3 centrePoint       = sphere->getPosition();
rotation[0]         = ?
rotation[1]         = ?
rotation[2]         = ?
Ogre::Vector3 halfEdgeLengths   = Ogre::Vector3( 1,1,1 );

myObject->setOBB( centrepoint, rotation, halfEdgeLengths );

Как я могу представить матрицу, используя три вектора (чего я не могу избежать при этом). Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 августа 2009

Матрица 3x3, представляющая вращение / масштаб в трехмерном пространстве, - это не более чем три вектора в строке. Каждый вектор столбца является повернутой и масштабированной главной осью. Первый столбец - это масштабированная и повернутая ось x, второй и третий - y и z. (Огре использует основные матрицы столбцов)

Итак, localAxes[3] - это просто вращение. И вы можете получить его из кватерниона.

Ogre::Vector3 rotation[3];
Ogre::Quaternion orientation = sphere->getOrientation();
orientation.ToAxes(rotation);
// Now rotation has the three axes representing the orientation of the sphere.
1 голос
/ 19 августа 2009

Хорошо. Итак, еще один вопрос: эта функциональность требует, чтобы она была матрицей, верно? Я так полагаю, или вы просто использовали бы векторы отдельных осей в местах, которые им нужны во время расчета.

Тем не менее, если вы поместите эти векторы в матрицу единообразным способом, то вы либо будете иметь их в виде строк матрицы или столбцов матрицы и, более или менее, с вероятностью 50% сделайте это правильно в зависимости от того, как функции, принимающие матрицу, ожидают, что матрица будет отформатирована. Итак, установите массив 2d в качестве матрицы и продвигайтесь с осторожностью, я бы посоветовал. Например:

int matrix[3][3] = {     { x1, x2, x3 },
                         { y1, y2, y3 },
                         { z1, z2, z3 }
                   };

Переверните, если вам нужно перейти к главному столбцу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...