Перед тем, как описывать поведение системы, нам понадобится математическая библиотека. Поскольку координаты тел, их скорости и действующие силы являются векторными величинами, то прежде всего нужен класс, описывающий векторные операции в трехмерном пространстве. Многочисленные реализации такого класса описаны в литературе, в частности, в:
- Millington I. Game Physics Engine Development (все издания).
- Монтенбрюк О., Пфлегер Т. Астрономия на персональном компьютере. — С.-Пб: Питер, 2002. — 322 с.
- Shapira Y. Mathematical Tools in C++. — Chapman & Hall/CRC, 2009. — 600 p.
- Press W. H., Teukolsky S. A., Wettrling W. T., Flannery B. P. Numerical Recipies. The Art of Scientific Computing. — 3rd Edition. — Cambridge University Press, 2007. — 1262 p.
Мы взяли за основу класс Vector3
из книги [1]. Вот его наиболее существенные поля и методы:
class Vector3
{
public:
double x;
double y;
double z;
...
public:
Vector3() : x(0), y(0), z(0) {}
Vector3(const double x, const double y, const double z)
: x(x), y(y), z(z) {}
double operator[](unsigned i) const
{
if (i == 0) return x;
if (i == 1) return y;
return z;
}
double& operator[](unsigned i)
{
if (i == 0) return x;
if (i == 1) return y;
return z;
}
...
Vector3 vectorProduct(const Vector3 &vector) const
{
return Vector3(y*vector.z-z*vector.y,
z*vector.x-x*vector.z,
x*vector.y-y*vector.x);
}
double scalarProduct(const Vector3 &vector) const
{
return x*vector.x + y*vector.y + z*vector.z;
}
void addScaledVector(const Vector3& vector, double scale)
{
x += vector.x * scale;
y += vector.y * scale;
z += vector.z * scale;
}
double magnitude() const
{
return sqrt(x*x+y*y+z*z);
}
...
};
Этот класс мы поместим в файл mathcore.h
. Позже, по необходимости, библиотека может пополнится классами, отвечающими за другие математические объекты: матрицы, кватернионы и т. п.
Комментарии
comments powered by Disqus