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

Содержание

Слайд 2

Вектор в однородной форме

Вектор в однородной форме

Слайд 3

Переход к новой системе координат

Переход к новой системе координат

Слайд 4

Координатный фрейм

Координатный фрейм

Слайд 5

Объектная система координат При создании (моделировании) объекта используется т. н. объектная (или локальная) система координат.

Объектная система координат

При создании (моделировании) объекта используется т. н. объектная (или

локальная) система координат.
Слайд 6

Объектная система координат Использование объектных координат сильно облегчает жизнь при создании

Объектная система координат

Использование объектных координат сильно облегчает жизнь при создании моделей

объектов. Разные модели никак не зависят друг от друга - можно использовать разные масштабы, разные точки отсчета и т. п.
Слайд 7

Мировая система координат Для того, что бы составить из нескольких объектов

Мировая система координат

Для того, что бы составить из нескольких объектов сцену,

необходимо расположить и ориентировать объекты друг относительно друга определенным образом.
Слайд 8

Мировая система координат Расположение и ориентация объектов сводится к переносу модели

Мировая система координат

Расположение и ориентация объектов сводится к переносу модели из

объектной системы координат в мировую.

Мировой называют систему координат, используемую как единую систему отсчета для всей сцены.

Слайд 9

Система координат камеры После того, как объекты помещены на сцену (в

Система координат камеры

После того, как объекты помещены на сцену (в мировую

систему координат!), самое время подумать о том, где и как установить камеру.
Слайд 10

Система координат камеры 1 2 3 1 2 3 Помещая камеру

Система координат камеры

1

2

3

1

2

3

Помещая камеру в различные точки сцены мы имеем возможность

акцентировать внимание зрителя на различных частях сцены
Слайд 11

Система координат камеры Система координат, в которой точка отсчета привязана к

Система координат камеры

Система координат, в которой точка отсчета привязана к камере,

используется в процессе отображения объектов на экран.

«Поместить камеру на сцену» означает ввести новую систему координат и поместить в нее объекты сцены.

Слайд 12

Система координат камеры y x z В библиотеках Direct3D и OpenGL

Система координат камеры

y

x

z

В библиотеках Direct3D и OpenGL оси системы координат камеры

ориентированы следующим образом: Ox - слева на право, Oy - с низу вверх, Oz - вглубь экрана для D3D и наоборот для OpenGL. Плоскость Oxy совпадает с плоскостью экрана.
Слайд 13

Положение наблюдателя void gluLookAt( GLdouble ex, GLdouble ey, GLdouble ez, GLdouble

Положение наблюдателя

void gluLookAt(
GLdouble ex, GLdouble ey, GLdouble ez, GLdouble cx, GLdouble

cy, GLdouble cz, GLdouble upx, GLdouble upy, GLdouble upz
);
Слайд 14

Система координат пользователя

Система координат пользователя

Слайд 15

Определение системы координат наблюдателя

Определение системы координат наблюдателя

Слайд 16

Пример

Пример

Слайд 17

Пример управления камерой #include #define _USE_MATH_DEFINES #include struct Point3 { double

Пример управления камерой

#include
#define _USE_MATH_DEFINES
#include
struct Point3
{
double x;
double y;
double z;
};
struct Vector3
{
double

x;
double y;
double z;
};
Point3 eye, look;
Vector3 up;
Vector3 u, v, n;
Слайд 18

Пример управления камерой //Загрузка матрицы моделирования-вида существующими для камеры величинами void

Пример управления камерой

//Загрузка матрицы моделирования-вида существующими для камеры величинами
void setModelViewMatrix(void)
{
float m[16

];
Vector3 eVec;
eVec.x = eye.x; eVec.y = eye.y; eVec.z = eye.z;
m[0] = u.x; m[4] = u.y; m[8] = u.z; m[12] = -eVec.x * u.x - eVec.y * u.y - eVec.z * u.z;
m[1] = v.x; m[5] = v.y; m[9] = v.z; m[13] = -eVec.x * v.x - eVec.y * v.y - eVec.z * v.z;
m[2] = n.x; m[6] = n.y; m[10] = n.z; m[14] = -eVec.x * n.x - eVec.y * n.y - eVec.z * n.z;
m[3] = 0.0; m[7] = 0.0; m[11] = 0.0; m[15] = 1.0;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(m);
}
Слайд 19

Пример управления камерой // Создание матрицы моделирования-вида void set(Point3 Eye, Point3

Пример управления камерой

// Создание матрицы моделирования-вида
void set(Point3 Eye, Point3 Look, Vector3

Up)
{
eye = Eye; look = Look; up = Up;
n.x = eye.x - look.x; n.y = eye.y - look.y; n.z = eye.z - look.z;
u.x = up.y * n.z - up.z * n.y; u.y = up.z * n.x - up.x * n.z; u.z = up.x * n.y - up.y * n.x;
double norm;
norm = sqrt(n.x * n.x + n.y * n.y + n.z * n.z);
n.x = n.x / norm; n.y = n.y / norm; n.z = n.z / norm;
norm = sqrt(u.x * u.x + u.y * u.y + u.z * u.z);
u.x = u.x / norm; u.y = u.y / norm; u.z = u.z / norm;
v.x = n.y * u.z - n.z * u.y; v.y = n.z * u.x - n.x * u.z; v.z = n.x * u.y - n.y * u.x;
setModelViewMatrix();
}
Слайд 20

Пример управления камерой //Скольжение void slide(float delU, float delV, float delN)

Пример управления камерой

//Скольжение
void slide(float delU, float delV, float delN)
{
eye.x += delU

* u.x + delV * v.x + delN * n.x;
eye.y += delU * u.y + delV * v.y + delN * n.y;
eye.z += delU * u.z + delV * v.z + delN * n.z;
setModelViewMatrix();
}
//Крен
void roll(float angle)
{
float cs = cos(M_PI / 180 * angle);
float sn = sin(M_PI / 180 * angle);
Vector3 t = u;
u.x = cs * t.x - sn * v.x; u.y = cs * t.y - sn * v.y; u.z = cs * t.z - sn * v.z;
v.x = sn * t.x + cs * v.x; v.y = sn * t.y + cs * v.y; v.z = sn * t.z + cs * v.z;
setModelViewMatrix();
}
Слайд 21

Пример управления камерой //Тангаж void pitch(float angle) { float cs =

Пример управления камерой

//Тангаж
void pitch(float angle)
{
float cs = cos(M_PI / 180 *

angle);
float sn = sin(M_PI / 180 * angle);
Vector3 t = v;
v.x = cs * t.x - sn * n.x; v.y = cs * t.y - sn * n.y; v.z = cs * t.z - sn * n.z;
n.x = sn * t.x + cs * n.x; n.y = sn * t.y + cs * n.y; n.z = sn * t.z + cs * n.z;
setModelViewMatrix();
}
//Рыскание
void yaw(float angle)
{
float cs = cos(M_PI / 180 * angle);
float sn = sin(M_PI / 180 * angle);
Vector3 t = u;
u.x = cs * t.x + sn * n.x; u.y = cs * t.y + sn * n.y; u.z = cs * t.z + sn * n.z;
n.x = -sn * t.x + cs * n.x; n.y = -sn * t.y + cs * n.y; n.z = -sn * t.z + cs * n.z;
setModelViewMatrix();
}
Слайд 22

Пример управления камерой //Поворот камеры вокруг оси v void rotate(float angle)

Пример управления камерой

//Поворот камеры вокруг оси v
void rotate(float angle)
{
float cs =

cos(M_PI / 180 * angle);
float sn = sin(M_PI / 180 * angle);
Point3 Eye, Look;
Vector3 Up;
Eye.x = cs * eye.x - sn * eye.z;
Eye.y = eye.y;
Eye.z = sn * eye.x + cs * eye.z;
Look = look;
Up = up;
set(Eye, Look, Up);
}
void setShape(float left, float right, float bottom, float top, float near, float far)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(left, right, bottom, top, near, far);
}
Слайд 23

Пример управления камерой void myKeyboard(unsigned char key, int x, int y)

Пример управления камерой

void myKeyboard(unsigned char key, int x, int y)
{
switch(key)
{
case '1':

slide(0, 0, 0.2); break; // скольжение вперед
case '2': slide(0, 0, -0.2); break; // скольжение назад
case '3': pitch(-1.0); break; // тангаж вверх
case '4': pitch(1.0); break; // тангаж ввниз
case '5': roll(-1.0); break; // крен влево
case '6': roll(1.0); break; // крен вправо
case '7': yaw(-1.0); break; // рыскание влево
case '8': yaw(1.0); break; // рыскание вправо
case '9': rotate(1.0); break;
case '0': rotate(-1.0); break;
}
glutPostRedisplay();
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutWireTeapot(1.0);
glFlush();
glutSwapBuffers();
}
Слайд 24

Пример управления камерой void main(int argc, char **argv) { glutInit(&argc, argv);

Пример управления камерой

void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutInitWindowPosition(50,

50);
glutCreateWindow("Пилотирование камеры вокруг чайника");
glClearColor(1.0f,1.0f,1.0f,1.0f);
glColor3f(0.0f,0.0f,0.0f);
glViewport(0, 0, 640, 480);
Point3 Eye = {4, 4, 4}, look = {0, 0, 0};
Vector3 up = {0, 1, 0};
set(Eye, look, up);
setShape(-2.0f, 2.0f, -2.0f, 2.0f, 0.0f, 10.0f);
glutDisplayFunc(myDisplay);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
}