Предыдущая Следующая
19.4. Получаем координаты прицела
Основной проблемой в механизме обработки выстрелов по мячам является различие координат в положении на экране двухмерного прицела и трехмерной модели. Как вы знаете, двухмерная плоскость имеет свою систему координат, а трехмерная плоскость - свою. У нас в игре одним из основных механизмов игровой логики является обработка выстрелов в мячики, где нам необходимо сопостав-
314 Стреляем по целям
лять текущие координаты спрайта с текущими координатами модели. И эти координаты будут абсолютно разными, поскольку системы отсчета у спрайтов и моделей разные. В связи с этим нам нужно создать механизм, который может перенести координаты спрайта в трехмерную плоскость.
В справочной информации по студии XNA Game Studio Express имеется показательный пример получения и переноса двухмерных координат спрайта в трехмерную плоскость. Мы воспользуемся этим примером, который состоит из двух частей. Первая часть примера представлена методом GetPickRay(), где происходят получение текущих координат прицела и перенос их в трехмерное пространство.
Ray GetPickRay() {
// задаем позицию прицела в центре изображения мушки
float cursorX = cursor.spritePosition.X + cursor.spriteTexture.Width/2; float cursorY = cursor.spritePosition.Y + cursor.spriteTexture.Height/2;
Vector3 nearsource = new Vector3(cursorX, cursorY, 0f); Vector3 farsource = new Vector3(cursorX, cursorY, 1f); // мировая матрица, все значения ставим в ноль world = Matrix.CreateTranslation(0, 0, 0); // матрица вида
view = Matrix.CreateLookAt(camera, 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() заключается в переносе двухмерных координат прицела в трехмерное пространство посредством матричных преобразований, и здесь имеется один очень важный нюанс.
Значения видовой и проекционной матриц для прицела должны быть идентичны значениям аналогичных матриц для моделей, с которыми в дальнейшем будут обрабатываться условия по совпадению координат. Если видовая и проекционная матрицы будут разными, то прицел и модели будут находиться в разных виртуальных измерениях! Поэтому как для мушки, так и для моделей значение видовой и проекционной матриц одинаково. Предыдущая Следующая
|