Иллюстрированный самоучитель по Flash-games


Преобразование координат


Местоположение объектов на экране определяется двумя координатами: х и у. Объекты в трехмерном пространстве должны иметь три координаты: х, у и z. Последняя определяет глубину.
Для отображения объектов на рабочем поле необходима функция, преобразующая х, у и z в экранные координаты х и у. Кроме того, вы будете наклонять и вращать объекты. Поэтому функция преобразования должна учитывать базовые наклоны и вращение.
Учтите, что это самый сложный сценарий из тех, которые мы до сих пор рассматривали и, возможно, из всех сценариев данной книги.
Математическая функция Math.atan (arctg, арктангенс) используется для преобразования координат в угол, а функции Math.sin и Math.cos - для преобразования значения углов обратно в координаты. Таким o6разом, координаты точки преобразуются в угол и расстояние от центра плоскости. Затем точка поворачивается и вновь преобразуется в координаты. Данное действие выполняется один раз для вращения и один раз для наклона. В результате вы получите координаты х и у, которые можно использовать на экране компьютера.
Комментарии, содержащиеся в нижеприведенном коде, объясняют, какое действие выполняет каждая его часть. Затем приводятся пошаговые объяснения.

// Переводим трехмерные координаты в координаты на экране

// (делаем проекцию).

function plotPoint(object) {

(1) //Берем координаты объекта.

х = object.x;

у = object.у

z = object.z;

(2) // Вычисляем расстояние от центра, radius = Math.sqrt (x*x+y*y);

(3) // Вычисляем первый угол.

if (х == 0) angle = Math.atan(1000000);

else angle = Math.atan(y/x);

if (x < 0) angle += Math.PI;

(4) // Поворачиваем объект,

angle += rotation;

(5) // Вычисляем новые координаты,

realx = radius*Math.cos(angle);

realz = radius*Math.sin(angle);

realy = z;

(6) // Определяем новое расстояние от центра,

radius = Math.sqrt(realy*realy+realz*realz);

(7) // Вычисляем второй угол.

if (realz == 0) angle = Math.atan(1000000);

else angle = Math.atan(realy/realz);

if (realz < 0) angle += Math.PI;

(8) // Добавляем угол наклона сечения,




Начало  Назад  Вперед