В Directx9 матрица вида устанавливается с помощью:
Device.SetTransform(D3DTS_VIEW, ViewMatrix);
мировая матрица устанавливается:
Device.SetTransform(D3DTS_WORLD, WorldMatrix);
Матрица вида строится с помощью 3 векторов:
D3DXMatrixLookAtLH(ViewMatrix, Eye, At, Up);
Где Eye - положение камеры, At - направление камеры в точку, Up - вектор, задающий направление вверх
Например,
Eye.x:=0; Eye.y:=0; Eye.z:=-3; At.x:=0; At.y:=0; At.z:=0; Up.x:=0; Up.y:=1; Up.z:=0;
1. Получается, если вектор задающий верх камеры совпадает с осью OY, то вращать камеру вокруг оси OZ можно только изменяя вектор, который задает направление верха?
2. Если вектор задающий верх камеры совпадает с осью OY, при этом ось OY перпендикулярна камере (например, камера находится в точке 0,х,0 и направлена в точку 0,0,0), то построить матрицу вида не удастся?
Придется изменять мировую матрицу, чтобы получить "вид сверху"?
3. Как стоит изменять положение и взгляд наблюдателя в пространстве: изменяя настройки матрицы вида или мировой матрицы?
Не помогайте, пусть грызёт гранит науки сам :)
innuendo
Вредный флудер:) Это не лабы и не курсовые:)
Сам отвечу на свои вопросы...
1. Да.
2. Да, мне не удалось. Да, чтобы получить "вид сверху" придется изменять мировую матрицу или изменять координаты вектора, определяющего верх.
3. Мне кажется, что проще работать с камерой.
Ramm
> 1. Получается, если вектор задающий верх камеры совпадает с осью OY, то вращать
> камеру вокруг оси OZ можно только изменяя вектор, который задает направление
> верха?
По секрету: там Up не имеется в виду мировой, там Up камеры ) А у камеры он может быть какой угодно. В функции расчёта видовой матрицы сначала находится Right = Cross(Up, At), а потом пересчитывается Up => Cross(At, Right)
Ramm
> Если вектор задающий верх камеры совпадает с осью OY, при этом ось OY
> перпендикулярна камере (например, камера находится в точке 0,х,0 и направлена в
> точку 0,0,0), то построить матрицу вида не удастся?
Смотря как строить. Я тебе рекомендую видовую матрицу ни в коем случае не конструировать каждый раз заново. Используй обычную матрицу. Как и у любого другого игрового объекта. А видовая матрица = инвертированная "мировая" ) Так ты сможешь вращать и перемещать камеру как любой другой объект в сцене, что правильно.
А расчёт вектора Up в твоём случае - вырожденный случай, у тебя бесконечно много Up-ов и надо больше знаний чтобы выбрать нужный. А лучше делать как я выше написал.
Ramm
> Как стоит изменять положение и взгляд наблюдателя в пространстве: изменяя
> настройки матрицы вида или мировой матрицы?
Именно как я в предыдущем посте написал. Для камеры заводишь "обычную мировую" матрицу и её крутишь/двигаешь камеру, а потом перед юзанием её в DX просто инвертируешь и всё.
L
> Я тебе рекомендую видовую матрицу ни в коем случае не конструировать каждый раз
> заново. Используй обычную матрицу. Как и у любого другого игрового объекта.
А почему? Кроме потери нескольких тактов в D3DXMatrixLookAtLH есть еще причины?
Ramm
> А почему? Кроме потери нескольких тактов в D3DXMatrixLookAtLH есть еще причины?
Дело не в тактах вовсе. Дело в том, что так у тебя будет унифицированная система трансформаций где камер ты сможешь трансформировать так же как и другие объекты. Например сможешь прицепить её как дочерний объект головы в иерархии и она с головой будет крутиться сама. Это удобно и правильно, а те функции в реальности почти ни где ни кому не нужны )
Deamon
Намек, что тактов чуть побольше?)
L
А я во всей литературе только на векторное расположение камеры и натыкаюсь.
Ramm
> А я во всей литературе только на векторное расположение камеры и натыкаюсь.
Выкинь каку из головы )
Тема в архиве.