Классы
В MGML_MATH поддерживаются следующие параметризованные классы:
template <int n,class T> class VECTOR;
template <int n,class T> class MATRIX;
template <class T> class QUATERNION;
template <int n,class T> class LINE;
template <int n,class T> class RAY;
template <int n,class T> class SEGMENT;
template <int n,class T> class PLANE;
template <int n,class T> class SPHERE;
template <int n,class T> class AABB; // Axis Aligned Binding Box
template <int n,class T> class BOX;
template <int n,class T> class TRIANGLE;
советы
используйте собственные typedef
в заголовочном файле MGML.h определены typedef для используемых типов. Для краткости записи, удобно использовать эти имена или можете определить собственные.
Особенности
порядок умножения векторов и матриц
Вы можете использовать любой порядок умножения векторов и матриц.
v1=m*v или v1 = v*m или v*=m, однако функции-члены класса MATRIX, отвечающие за установку трехмерных преобразований рассчитаны на стандартный порядок умножения, принятый в математике v1=m*v. Если вы используете другой порядок, не забудьте транспонировать ваши матрицы функцией-членом Transpose()
быстрое умножение матрицы на вектор
Используйте mult_matrix4x4f_vector4f_fast, которая написана на встроенном ассемблере во избежание лишних копирований. Хотя operator* вызывает ее для пар (VECTOR<4,float>,MATRIX<4,4,float>) возможно одно лишнее копирование из-за создания вектора-результата на стеке.
operator==(vec)
operator==(vec) не затрагивает правило про DISCARD_FOURTH_DIMENTION. Сравниваться будут все 4 координаты. Это сделано намеренно исходя из смыслового значения оператора сравнения объектов. Если вам нужно проверить совпадают-ли только три координаты вектора, можно сравнить (v1-v2).lenSquare() с эпсилон(некое малое число). Лучше всего не используйте operator==(vec) вообще.
наследование от SSE_Aligned_Object или Auto_Align
Если у вас есть структура, включающая в себя структуру, наследуемую от SSE_Aligned_Object или Auto_Align, то уже текущую структуру наследовать от SSE_Aligned_Object или Auto_Align нельзя. Придется убрать наследование либо на уровне вашей либо на уровне входящей структуры. В этом случае, операторы new и выравнивание следует добавлять вручную. В противном случае ваша структура может иметь разный размер для компиляторов nvcc и msvc. Это баг nvcc.
|