Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 действия: вычислить результирующую матрицу и произвести умножение на нее всех точек. |