Предыдущая Следующая
В справочной информации по студии XNA Game Studio Express имеется показательный пример получения и переноса двухмерных координат мыши в трехмерную плоскость. Мы воспользуемся этим примером, который состоит из двух частей. Первая часть примера представлена методом GetPickRay(), где происходят получение текущих координат мыши и перенос их в трехмерное пространство.
Ray GetPickRay() {
mouseState = Mouse.GetStateO; int mouseX = mouseState.X; int mouseY = mouseState.Y;
Vector3 nearsource = new Vector3((float)mouseX, (float)mouseY, 0f); Vector3 farsource = new Vector3((float)mouseX, (float)mouseY, 1f); // мировая матрица, все значения ставим в ноль world = Matrix.CreateTranslation(0, 0, 0); // матрица вида
view = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 150.0f), Vector3.Zero,
Vector3.Up);
// матрица проекции
proj = Matrix.CreatePerspectiveFieldOfView(FOV, aspectRatio, nearClip,
farClip);
// ближняя точка
Vector3 nearPoint = graphics.GraphicsDevice.Viewport.Unproject(nearsource, proj, view, world); // дальняя точка
Vector3 farPoint = graphics.GraphicsDevice.Viewport.Unproject(farsource, proj, view, world);
Vector3 direction = farPoint - nearPoint; direction.Normalize();
Ray pickRay = new Ray(nearPoint, direction); return pickRay;
}
Сложный метод, но его можно рассматривать как часть объектно-ориентированного программирования, когда совсем не обязательно знать, как работает тот или иной метод, или класс. Суть метода GetPickRay() заключается в переносе
308 Стреляем по целям
Целимся и стреляем 309
координат мыши в трехмерное пространство посредством матричных преобразований, и здесь имеется один очень важный нюанс.
Значения видовой и проекционной матриц для курсора мыши должны быть идентичны значениям аналогичных матриц для моделей, с которыми в дальнейшем будут обрабатываться условия по совпадению координат. Если видовая и проекционная матрицы будут разными, то курсор и модели будут находиться в разных виртуальных измерениях! Поэтому как для курсора, так и для моделей значение видовой и проекционной матриц у нас одинаково.
20.5. Целимся и стреляем
После того как вы сформировали метод GetPickRayO для переноса координат прицела из одной плоскости в другую, можно приступать к работе над вторым методом, который будет обрабатывать уже непосредственно столкновение объектов в пространстве. Для начала объявим в классе Gamel новый объект bb класса BoundingSphere.
public BoundingSphere[] bb = new BoundingSphere[3]; Предыдущая Следующая
|