Как каждый преобразовывает мировые координаты в координаты камеры?

Нет, нет. Объекты JavaScript не позволяют иметь свойства с одинаковыми именами.

Вы должны изменить имя свойства со стороны API.

14
задан Stefan Kendall 29 March 2009 в 17:55
поделиться

3 ответа

Матрица преобразования мира к камере является инверсией матрицы камеры к миру. Матрица камеры к миру является комбинацией перевода в положение камеры и вращения к ориентации камеры. Таким образом, если M 3x3, соответствие матрицы вращения ориентации и t камеры является положением камеры, то 4x4 матрица камеры к миру:

M00 M01 M02 tx
M10 M11 M12 ty
M20 M21 M22 tz
0   0  0   1

Обратите внимание, что я предположил, что векторы являются векторами - столбцами, которые умножаются на праве выполнить преобразования. При использовании противоположной конвенции удостоверьтесь, что транспонировали матрицу.

Для нахождения M можно использовать одну из формул, перечисленных на Википедию, в зависимости от конкретной конвенции для списка, подачи и отклонения от курса. Следует иметь в виду, что те формулы используют конвенцию, что векторы являются векторами - строками, которые умножаются слева.

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

17
ответ дан 1 December 2019 в 14:33
поделиться

Если у нас есть структура как это для описания 4x4 матрица:

class Matrix4x4
{
public:
    union
    {
        struct
        {
            Type Xx, Xy, Xz, Xw;
            Type Yx, Yy, Yz, Yw;
            Type Zx, Zy, Zz, Zw;
            Type Wx, Wy, Wz, Ww;
        };

        struct
        {
            Vector3<Type> Right;
            Type XW;
            Vector3<Type> Up;
            Type YW;
            Vector3<Type> Look;
            Type ZW;
            Vector3<Type> Pos;
            Type WW;
        };

        Type asDoubleArray[4][4];
        Type asArray[16];
    };
};

Если все, что Вы имеете, является Euler углами, который является углами, представляющими отклонение от курса, подачу, и список и точку в 3-м пространстве для положения, можно вычислить Право, и векторы Взгляда. Обратите внимание, что Право, и Взгляд являются просто этими X, Y, Z Векторы, но так как это - камера, я нахожу легче назвать его так. Самый простой способ применить Ваш roations к матрице камеры состоит в том, чтобы создать серию матриц вращения и умножить нашу матрицу камеры на каждую матрицу вращения.

Хорошая ссылка для этого здесь: http://www.euclideanspace.com

После того как Вы применили все необходимые вращения, можно установить вектор На месте продажи на положение камеры в мировом пространстве.

Наконец перед применением преобразования камеры необходимо взять инверсию камеры ее матрицы. Это - то, что Вы собираетесь умножить свою modelview матрицу на то, прежде чем Вы начнете тянуть полигоны. Для матричного класса выше, инверсия вычисляется как это:

template <typename Type>
Matrix4x4<Type> Matrix4x4<Type>::OrthoNormalInverse(void)
{
    Matrix4x4<Type> OrthInv;
    OrthInv = Transpose();
    OrthInv.Xw = 0;
    OrthInv.Yw = 0;
    OrthInv.Zw = 0;
    OrthInv.Wx = -(Right*Pos);
    OrthInv.Wy = -(Up*Pos);
    OrthInv.Wz = -(Look*Pos);
    return OrthInv;
}

Таким образом, наконец, со всей нашей матрицей constuction из пути, Вы сделали бы что-то вроде этого:

Matrix4x4<float> cameraMatrix, rollRotation, pitchRotation, yawRotation;
Vector4<float> cameraPosition;

cameraMatrix = cameraMatrix * rollRotation * pitchRotation * yawRotation;

Matrix4x4<float> invCameraMat;

invCameraMat = cameraMatrix.OrthoNormalInverse();

glMultMatrixf(invCameraMat.asArray);

Надеюсь, это поможет.

7
ответ дан 1 December 2019 в 14:33
поделиться

То, что Вы описываете, называют 'Перспективной проекцией' и существуют стопки ресурсов в сети, которые объясняют матричную математику и дают код, необходимый, чтобы сделать это. Вы могли запустить со страницы Википедии

-11
ответ дан 1 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: