Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > построение сцены с подвижным наблюдателем


Автор: PRF 9.5.2009, 21:56
здравствуйте, я делаю подвижного наблюдателя и возникли проблемы. 
Существуют точки объекта, мировая система координат, система координат наблюдателя и фокусное расстояние для центрального проецирования. 
Наблюдатель находить на оси z СКН на фокусном расстоянии я так понимаю. 
Допустим СКН мы расположили , центр, в таких точках относительно МСК , (100, 30, 300)

Я хочу сделать перемещение вперед, что мне надо сделать? если увеливать z, ну центр СКН увеличивать по оси Z (100, 30, 301) , то получается какой то бред, ведь фокусное расстояние остается таким же.. 

как это вообще делать.. не понимаю

Автор: NightmareZ 9.5.2009, 22:39
Шоза "фокусное расстояние"? 

Автор: C/L 15.5.2009, 10:52
При перспективном (центральном) проецировании есть точка где сходятся все проекционные лучи. С точки зрения оптики ее расстояние до плоскости проекции можно конечно назвать фокусным расстоянием. Но при чем здесь это? Надо разделять матрицу проецирования и матрицу вида, а еще и матрицу обьекта. Матрица объекта - чтобы двигать объект, матрица вида - чтобы двигать наблюдателя, матрица проекции - чтобы потом все это спроецировать на плоскость проекции. Сначала формируем одну потом другую потом третью и только потом перемножаем их и получаем конечную матрицу с которой можно работать. Формула получается такая:
v2 = W*V*P*v1
W - матрица объекта
V - матрица вида (наблюдателя)
P - матрица проекции
v1 - исходная точка (вектор)
v2 - спроецированная точка (вектор)
Все это подробно расписывается в книгах по DirectX.

Автор: PRF 15.5.2009, 21:12
Ага. знаю, только все передвижения и все это , я реализую не directx. Directx у меня только для отрисовки используется. Но спасибо

Автор: C/L 16.5.2009, 10:36
Ну это не создатели DirectX придумали. Думаю все было известно и до них. Это простая математика матричных и векторных преобразований. Конечно для простого движения наблюдателя назад или вперед можно вывести простую формулу. Но тогда для движения по каждой оси нужна будет отдельная формула. А ведь еще есть повороты тоже для каждой оси. А еще масштабирование - например если наблюдатель решил посмотреть в бинокль. А если есть какой нибудь объект из миллиона точек и нужно передвигать его в каждом кадре? А тут хоть и вычисление с матрицами, но зато одна простая формула на все случаи. Всего 2 действия: вычислить результирующую матрицу и произвести умножение на нее всех точек.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)