Студопедия — Применение OpenGL. Описание примитивов вывода отрезков.
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Применение OpenGL. Описание примитивов вывода отрезков.






Работа по вычислению координат вектора при его повороте вокруг произвольный оси на произвольный угол выполняется в методе Rotate класса Point3D. В этом методе запрограммирована последняя формула. Важно не забыть перевести угол в радианы и нормировать вектор оси вращения, так как орт k в формуле имеет единичную длину, а входной параметр метода Rotate — нет.

class Point3D

{

public:

double x, y, z;

 

Point3D() { x = y = z = 0.; }

Point3D (double xx, double yy, double zz) { x = xx; y = yy; z = zz; }

Point3D (double v[3]) { x = v[0]; y = v[1]; z = v[2]; }

Point3D operator+ (Point3D& p) { return Point3D (x+p.x, y+p.y, z+p.z); }

Point3D operator- (Point3D& p) { return Point3D (x-p.x, y-p.y, z-p.z); }

void operator+= (Point3D& p) { x += p.x; y += p.y; z += p.z; }

void operator-= (Point3D& p) { x -= p.x; y -= p.y; z -= p.z; }

double operator! () { return sqrt (x*x + y*y + z*z); }

Point3D operator* (double d) { return Point3D (x*d, y*d, z*d); }

Point3D operator* (Point3D& p)

{

return Point3D (y*p.z - z*p.y, z*p.x - x*p.z, x*p.y - y*p.x);

}

 

void ToUnit ()

{

double r =!*this;

if (r!= 0)

{

x /= r; y /= r; z /= r;

}

}

 

double Dist (Point3D& p) { return!Point3D (*this - p); }

 

Point3D& Rotate (Point3D& p, double a)

{

a = a * ToRad;

p.ToUnit();

double

ca = cos(a),

sa = sin(a),

c = 1 - cos(a),

xs = p.x * sa,

ys = p.y * sa,

zs = p.z * sa,

xy = p.x * p.y * c,

xz = p.x * p.z * c,

yz = p.y * p.z * c,

xn = (p.x * p.x * c + ca) * x + (xy - zs) * y + (xz + ys) * z,

yn = (xy + zs) * x + (p.y * p.y * c + ca) * y + (yz - xs) * z,

zn = (xz - ys) * x + (yz + xs) * y + (p.z * p.z * c + ca) * z;

x = xn; y = yn; z = zn;

return *this;

}

};

Приведем пример вызова метода Rotate при вычислении нового положения вектора gU (объекта класса Point3D) при изменении угла крена angle в программе по управлению полетом.

gU.Rotate (gC - gE, angle);

Здесь gU, gC и gE являются веторами (объектами класса Point3D). Вектор gU необходимо повернуть при изменении угла крена модели летательного аппарата. При вызове функции OpenGL glLookAt, управляющей матрицей моделирования OpenGL, как вы помните, следует задать координаты трех векторов:

· Положение камеры (глаза наблюдателя) — gE,

· Положение центра сцены (точки, куда направлена камера) — gC,

· Направление вверх gU, которое должно быть ортогонально вектору направления взгляда (gC – gE).

Разность векторов gC и gE задает направление оси вращения, как видно из рисунка ниже.

gU
gC – gE
gE
o
k
 
angle

Полный текст программы, моделирующей полет (Pilot3.cpp и Pilot3M.cpp), приведен в папке с материалами курса. Для размышления о повороте векторов приведу код метода, который реализует изменение угла тангажа (Pitch). Угол поворота задается в градусах, поэтому он может быть целочисленным.

void Pitch (int angle)

{

Point3D

v = gC - gE, // Направление на центр сцены (взгляда)

n = v * gU; // Векторное произведение этих векторов определяет ось вращения при изменении тангажа

gC = gE + v.Rotate(n, angle);

gU.Rotate (n, angle);

Fly();

}

Обратите внимание, что при изменении угла тангажа (атаки) изменяется как положение центра сцены, так и направление вверх, которое должно всегда быть ортогональным направлению взляда.

Применение OpenGL. Описание общей структуры команд о OpenGL.

Применение OpenGL. Описание примитивов вывода отрезков.

GL_LINES каждая отдельная пара вершин определяет отрезок; если задано нечетное число вершин, то последняя вершина игнорируется.
GL_LINE_STRIP каждая следующая вершина задает отрезок вместе с предыдущей.
GL_LINE_LOOP отличие от предыдущего примитива только в том, что последний отрезок определяется последней и первой вершиной, образуя замкнутую ломаную.






Дата добавления: 2015-10-19; просмотров: 512. Нарушение авторских прав; Мы поможем в написании вашей работы!



Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Реформы П.А.Столыпина Сегодня уже никто не сомневается в том, что экономическая политика П...

Виды нарушений опорно-двигательного аппарата у детей В общеупотребительном значении нарушение опорно-двигательного аппарата (ОДА) идентифицируется с нарушениями двигательных функций и определенными органическими поражениями (дефектами)...

Особенности массовой коммуникации Развитие средств связи и информации привело к возникновению явления массовой коммуникации...

Медицинская документация родильного дома Учетные формы родильного дома № 111/у Индивидуальная карта беременной и родильницы № 113/у Обменная карта родильного дома...

Основные разделы работы участкового врача-педиатра Ведущей фигурой в организации внебольничной помощи детям является участковый врач-педиатр детской городской поликлиники...

Ученые, внесшие большой вклад в развитие науки биологии Краткая история развития биологии. Чарльз Дарвин (1809 -1882)- основной труд « О происхождении видов путем естественного отбора или Сохранение благоприятствующих пород в борьбе за жизнь»...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия