Студопедия — Применение 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; просмотров: 502. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

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

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

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

Классификация ИС по признаку структурированности задач Так как основное назначение ИС – автоматизировать информационные процессы для решения определенных задач, то одна из основных классификаций – это классификация ИС по степени структурированности задач...

Внешняя политика России 1894- 1917 гг. Внешнюю политику Николая II и первый период его царствования определяли, по меньшей мере три важных фактора...

Оценка качества Анализ документации. Имеющийся рецепт, паспорт письменного контроля и номер лекарственной формы соответствуют друг другу. Ингредиенты совместимы, расчеты сделаны верно, паспорт письменного контроля выписан верно. Правильность упаковки и оформления....

Решение Постоянные издержки (FC) не зависят от изменения объёма производства, существуют постоянно...

ТРАНСПОРТНАЯ ИММОБИЛИЗАЦИЯ   Под транспортной иммобилизацией понимают мероприятия, направленные на обеспечение покоя в поврежденном участке тела и близлежащих к нему суставах на период перевозки пострадавшего в лечебное учреждение...

Кишечный шов (Ламбера, Альберта, Шмидена, Матешука) Кишечный шов– это способ соединения кишечной стенки. В основе кишечного шва лежит принцип футлярного строения кишечной стенки...

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