Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: Создать камеру в DirectX 9  (Прочитано 123400 раз)
0 Пользователей и 15 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #90 : 11-07-2009 08:36 » 

zuze, проверить надо всего лишь один раз - при отладке функции ) Больше призма НИКОГДА не собьётся.

ты как-то неправильно понимаешь этот момент, наверное. Это можно сравнить с проволочным каркасом - один раз его подогнать, а потом только вращать вокруг осей, не изгибая проволоку больше никогда
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #91 : 13-07-2009 15:37 » 

А можно так проверить сбиваються ли векторы?

У меня есть вектора: _right, _up, _look

Надо проверить что бы эти вектора были ортогональны делаю так

Сколярное перемножение векторов и сравнивания с нулём (этот код вставляю в конце функции getViewMatrix)

Код:
test = (_right.x*_up.x*_look.x) + (_right.y*_up.y*_look.y) + (_right.z*_up.z*_look.z)

if (test == 0)
{
  // Вывод на экран или в файл результата
}

Если можно так проверить как я описал выше, достаточно одну проверку сделать или какое нужно количесво проверок сделать?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #92 : 13-07-2009 16:40 » 

если эти вектора не хранить в векторном виде, то они никогда не собьются, почему ты в это не веришь ))

или хочешь постоянно дрожать, что они собьются и постоянно проверять это ? Да ну нафиг...

----------------------------
скалярное произведение проверить можно на 0, но не так, как у тебя:

const acc=0.00001;//к примеру
if(test>-acc && test <acc)
{
   //считаем, что (test==0)
}
---------------------------
и чем тебя не устроил мой вариант - с хранением позиции + трёх углов ? Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #93 : 13-07-2009 17:11 » new

Дело в том, что я на одном из форумов задал про это же вопрос и предложил твою идею.

И вот что мне ответили:

А выводить эти вектора в виде x y z не выход? С точностью хотя бы 5-ти знаков

я неочень понял ответ, но сомнения возникли.

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #94 : 13-07-2009 17:36 » 

так это снова получится хранение векторов же
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #95 : 13-07-2009 18:18 » 

Вот я и не понял почему мне такой ответ дали.

Ну так перейдём к твоей идеи.

Я так понял надо вставить код для рисования вертиксы-точки в конце функции getViewMatrix.

У меня только два маленьких вопроса:

1. Что такое вертиксы-точки - это линия показывающая вектор или что то другое?
2. Откуда брать координаты вертиксов-точек?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #96 : 13-07-2009 18:35 » 

встраивать в  getViewMatrix ничего не нужно, надо просто создать тестовые объёкты. Вычертить где нибудь призму и примерно найти тестовые координаты (углы призмы, 8 штук). Точки - это точки Улыбаюсь Points list
А я на сегодня уже спать ...
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #97 : 13-07-2009 21:00 » 

Я ещё всё таки хотел уточнить

1. А в моём классе векторы заданы правильно, то есть они не когда не собьются?

2. Если у меня вектора в классе заданы правильно и они всегда будут ортогональны зачем мы вообще что то проверяем тогда, у нас может сбиться что то ещё?
« Последнее редактирование: 13-07-2009 22:13 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #98 : 14-07-2009 04:00 » 

1. покажи код, я в вапе щас запутался, где у тебя последний раз эти вектора заданы )))

2. да вроде как съехать могут только вектора, если хранить их сразу как тройку
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #99 : 14-07-2009 10:04 » 

Код:
private:
     D3DXVECTOR3 _right;     
     D3DXVECTOR3 _up;       
     D3DXVECTOR3 _look;

а в  конструкторе класса инициализируются.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #100 : 14-07-2009 10:23 » 

ну, такие - уплывут Улыбаюсь

а эти вектора - константы Ага
вроде этого
     D3DXVECTOR3 _right(1,0,0);
     D3DXVECTOR3 _up(0,1,0);
     D3DXVECTOR3 _look(0,0,1);

а константы, как известно, не умеют уплывать Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #101 : 14-07-2009 10:33 » 

То есть если у меня в конструкторе сделанно так

Код:
Camera::Camera()
{
           _right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
           _up    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
           _look  = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
}

а надо это переделать так


Код:
private:

     _right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
     _up    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
     _look  = D3DXVECTOR3(0.0f, 0.0f, 1.0f);

Я правельно понял и тогда вектора не поплывут?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #102 : 14-07-2009 10:43 » 

я, наверное, свою мысль неправильно рассказал. Короче, смотри: обрати внимание - у меня в коде нету в конструкторе этих векторов вообще. Константа возникает, когда делаем Get...Vec
Код:
//получить вектор Up
inline void GetUpVec(D3DXVECTOR3* pU)const
{
D3DXMATRIX MXYZ;
*pU=D3DXVECTOR3(0,1,0);
::D3DXVec3TransformCoord(pU, pU, GetXYZrotateMatrix(&MXYZ));
}

тут ничего в принципе уплыть не может. Все три Get'а отлажены - я проверял.
Код:
::D3DXVec3Cross(..,&up,&right) == -look

проверь тоже, чтоб проверить меня )
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #103 : 22-07-2009 07:50 » 

Я посмотрел твой класс, если я буду использовать методы GetUpVec, GetRightVec и GetLookVec в них есть метод GetXYZrotateMatrix, а он ещё зависит от нескольких методов, это уже весь мой класс надо переделывать.

Есть мнение что бы не проверять векторы на ортогональность нужно задать вектора с помощью углов Эйлера, но как это сделать?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #104 : 22-07-2009 08:22 » 

где от чего он зависит ? Улыбаюсь
Код:
	inline D3DXMATRIX* GetXYZrotateMatrix(D3DXMATRIX* pMXYZ)const
{
D3DXMATRIX TX,TY,TZ;
D3DXVECTOR3 VX(1,0,0);
D3DXVECTOR3 VY(0,1,0);
D3DXVECTOR3 VZ(0,0,1);

::D3DXMatrixRotationAxis(&TX, &VX, m_ax);
::D3DXMatrixRotationAxis(&TY, &VY, m_ay);
::D3DXMatrixRotationAxis(&TZ, &VZ, m_az);

*pMXYZ=TX*TY*TZ;
return pMXYZ;
}

ну а если всё же что то у тебя накладывается - переименуй метод, да и всё
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #105 : 22-07-2009 08:32 » 

что за углы Эйлера не знаю, но сильно подозреваю, что мои три угла - это эквивалент Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #106 : 24-07-2009 20:12 » 

Я решил не практически, а теоретически разобраться, будут ли у меня векторы всегда ортогональны или нет.

Для того чтобы у меня были всегда векторы ортогональны я использую такой код и я сейчас разобрался в нём и даю подробные комментарии:

Код:
// Делаем оси камеры ортогональными

// Приведение вектора _look к единичному вектору, так этот вектор направления
D3DXVec3Normalize(&_look, &_look);

// Возможна ситуация когда вектор _up не перпендикулярен вектору _look.
// Для решения этой проблемы делаем векторного перемножения вектора _look и вектора _right, и получаем вектор _up.
D3DXVec3Cross(&_up, &_look, &_right);
// Приведение вектора _up к единичному вектору, так этот вектор направления
D3DXVec3Normalize(&_up, &_up);

// Возможна ситуация когда вектор _right не перпендикулярен вектору _look.
// Для решения этой проблемы делаем векторного перемножения вектора _up и вектора _look,  и получаем вектор _right.
D3DXVec3Cross(&_right, &_up, &_look);
// Приведение вектора _right к единичному вектору, так этот вектор направления
D3DXVec3Normalize(&_right, &_right);

Вывод: У меня векторы всегда будут ортогональны.

Так что теперь я могу спокойно приступать к алгоритму View Frustum Culling, я уже пробовал с ним разобраться, но у меня ничего не получилось начну заново и от начала с этим алгоритмом, задавать вопросы по поводу этого алгоритма буду в этой теме, так как этот алгорит служит для усовершенствования класса "Камера".
« Последнее редактирование: 24-07-2009 20:20 от zuze » Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #107 : 28-07-2009 09:37 » 

Начинаю разбирать алгоритм View Frustum Culling

Маленький теоретический вопрос

Камера с усечённой пирамидой во всех примерах рисуется так



Но также во всех примерах центр всех вектора камеры рисуется в центре камеры.



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

Но как мы видим из первого рисунка это плоскость рисуется перед камерой и не пересекает центр координат всех векторов камеры.

Так рисуется, только для того, что бы было красиво, а на самом деле эта плоскость пересекает центр всех векторов камеры?



 
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #108 : 28-07-2009 09:52 » 

на самом деле всё ещё проще - камера это ТОЧКА проекции (пересечение трёх векторов) + плоскость проекции (near plane)

То есть вот этот чёрный агрегат нарисован для красоты Улыбаюсь

Цитата
Ближняя ограничительная плоскость, за которой объекты не видимы, так как они за камерой.
это неверно, объекты могут быть и перед камерой, но за плоскостью. И они видны, вообще говоря, всегда, только они спроецируются в перевёрнутом виде Улыбаюсь Но, директ икс их не рисует.
« Последнее редактирование: 28-07-2009 09:55 от Алексей1153++ » Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #109 : 28-07-2009 09:55 » 

Но ведь вроде в алгоритме расстояние между  Точкой проекции (пересечение трёх векторов) и Ближняя ограничительная плоскость не выщитывается, значит наверно так рисуется только для красоты, но это нужно ещё уточнить.
« Последнее редактирование: 28-07-2009 10:02 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #110 : 28-07-2009 09:57 » 

near plane - это плоскость проекции, это экран монитора, считай так. Так что вовсе не для красоты )
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #111 : 29-07-2009 13:20 » 

Цитата: Алексей1153++
это неверно, объекты могут быть и перед камерой, но за плоскостью. И они видны, вообще говоря, всегда, только они спроецируются в перевёрнутом виде  Но, директ икс их не рисует.

Прочитал твои предложения и мне всё стало понятно с этим вопросом. Спасибо за разъяснения.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #112 : 30-07-2009 13:45 » 

Перехожу к практической части.

Создаём усечённую пирамиду

Код:
// Создание усечённой пирамиды
void Camera::CreatePyramid(D3DXMATRIX MV, D3DXMATRIX MP)
{
       D3DXMATRIX Matrix;
       D3DXMatrixMultiply(&Matrix, &MV, &MP);

        // Левая плоскость
        mPlanes[0].a = Matrix._14 + Matrix._13;
        mPlanes[0].b = Matrix._24 + Matrix._23;
        mPlanes[0].c = Matrix._34 + Matrix._33;
        mPlanes[0].d = Matrix._44 + Matrix._43;

        // Правая плоскость
        mPlanes[1].a = Matrix._14 - Matrix._13;
        mPlanes[1].b = Matrix._24 - Matrix._23;
        mPlanes[1].c = Matrix._34 - Matrix._33;
        mPlanes[1].d = Matrix._44 - Matrix._43;
                          
        // Верхняя плоскость
        mPlanes[2].a = Matrix._14 + Matrix._11;
        mPlanes[2].b = Matrix._24 + Matrix._21;
        mPlanes[2].c = Matrix._34 + Matrix._31;
        mPlanes[2].d = Matrix._44 + Matrix._41;

        // Нижняя плоскость
        mPlanes[3].a = Matrix._14 - Matrix._11;
        mPlanes[3].b = Matrix._24 - Matrix._21;
        mPlanes[3].c = Matrix._34 - Matrix._31;
        mPlanes[3].d = Matrix._44 - Matrix._41;
      
        // Ближняя плоскость
        mPlanes[4].a = Matrix._14 + Matrix._12;
        mPlanes[4].b = Matrix._24 + Matrix._22;
        mPlanes[4].c = Matrix._34 + Matrix._32;
        mPlanes[4].d = Matrix._44 + Matrix._42;
      
        // Дальняя плоскость
        mPlanes[5].a = Matrix._14 - Matrix._12;
        mPlanes[5].b = Matrix._24 - Matrix._22;
        mPlanes[5].c = Matrix._34 - Matrix._32;
        mPlanes[5].d = Matrix._44 - Matrix._42;

        // Нормализация плоскостей
        for (int i = 0; i < 6; i++)
D3DXPlaneNormalize(&mPlanes[i], &mPlanes[i]);
}

mPlanes - обявляется так
Код:
 D3DXPLANE mPlanes[6]; // Массив плоскастей для усечённой пирамиды

Вычисление матриц вида и проекции

Код:
// Вычисление матриц вида и проекции, на основании заданных векторов камеры
void Camera::getViewMatrix(LPDIRECT3DDEVICE9 pD3DDevice)
{
     // Матрица вида
     D3DXMATRIX MatrixView;
     // Матрица проекции
     D3DXMATRIX MatrixProjection;

    // Делаем оси камеры ортогональными

    // Приведение вектора _look к единичному вектору, так этот вектор направления
    D3DXVec3Normalize(&_look, &_look);

    // Возможна ситуация когда вектор _up не перпендикулярен вектору _look.
    // Для решения этой проблемы делаем векторного перемножения вектора _look и вектора _right, и получаем вектор _up.
    D3DXVec3Cross(&_up, &_look, &_right);
    // Приведение вектора _up к единичному вектору, так этот вектор направления
    D3DXVec3Normalize(&_up, &_up);

    // Возможна ситуация когда вектор _right не перпендикулярен вектору _look.
    // Для решения этой проблемы делаем векторного перемножения вектора _up и вектора _look,  и получаем вектор _right.
    D3DXVec3Cross(&_right, &_up, &_look);
    // Приведение вектора _right к единичному вектору, так этот вектор направления
    D3DXVec3Normalize(&_right, &_right);

     // Строим матрицу вида:
     float x = -D3DXVec3Dot(&_right, &_pos);
     float y = -D3DXVec3Dot(&_up, &_pos);
     float z = -D3DXVec3Dot(&_look, &_pos);

     (MatrixView)(0, 0) = _right.x;
     (MatrixView)(0, 1) = _up.x;
     (MatrixView)(0, 2) = _look.x;
     (MatrixView)(0, 3) = 0.0f;

     (MatrixView)(1, 0) = _right.y;
     (MatrixView)(1, 1) = _up.y;
     (MatrixView)(1, 2) = _look.y;
     (MatrixView)(1, 3) = 0.0f;

     (MatrixView)(2, 0) = _right.z;
     (MatrixView)(2, 1) = _up.z;
     (MatrixView)(2, 2) = _look.z;
     (MatrixView)(2, 3) = 0.0f;

     (MatrixView)(3, 0) = x;
     (MatrixView)(3, 1) = y;
     (MatrixView)(3, 2) = z;
     (MatrixView)(3, 3) = 1.0f;

     // Обновление матрицы вида согласно новому
     // местоположению и ориентации камеры
     pD3DDevice->SetTransform(D3DTS_VIEW, &MatrixView);

     // Изменяем матрицу проекции
     D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции
                                                       D3DX_PI/4,        // поле зрения в направлении оси Y в радианах
                                                       1.54f,                 // соотношения сторон экрана 770/500=1.54
                                                       10.0f,                 // передний план отсечения сцены
                                                       200.0f);             // задний план отсечения сцены
    // Устанавливаем матрицу проекции
    pD3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}

Как мы видим функция void Camera::CreatePyramid(D3DXMATRIX MV, D3DXMATRIX MP) принимает значения матриц вида и проекции, но функция void Camera::getViewMatrix(LPDIRECT3DDEVICE9 pD3DDevice) их не возвращает.

А вот и сам вопрос.

Что нужно сделать что бы я мог передать в функцию void Camera::CreatePyramid(D3DXMATRIX MV, D3DXMATRIX MP) значения матриц вида и проекции?

У меня есть несколько идей:

1. Разбить функцию void Camera::getViewMatrix(LPDIRECT3DDEVICE9 pD3DDevice) на две функции которые бы возращали матрицу;
2. В функции void Camera::getViewMatrix(LPDIRECT3DDEVICE9 pD3DDevice) загнать результат двух матриц в один массив и возвращать его;

И ещё маленький вопрос.

Мы в функции void Camera::CreatePyramid(D3DXMATRIX MV, D3DXMATRIX MP) матрицу вида умножаем на матрицу проекции.

Я понимаю что мы получаем общую матрицу и для чего они нужны в отдельности:
1. Матрица вида - отвечает за то, какая часть сцены будет видна на экране.
2. Матрица проекции - отвечает за то, как трехмерные координаты будут преобразованы в двумерные для отображения на экран.

А что даёт перемножение этих матриц не понимаю?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #113 : 30-07-2009 15:19 » 

Цитата
А вот и сам вопрос.

Что нужно сделать что бы я мог передать в функцию void Camera::CreatePyramid(D3DXMATRIX MV, D3DXMATRIX MP) значения матриц вида и проекции?
У меня есть несколько идей:

1. Разбить функцию void Camera::getViewMatrix(LPDIRECT3DDEVICE9 pD3DDevice) на две функции которые бы возращали матрицу;
2. В функции void Camera::getViewMatrix(LPDIRECT3DDEVICE9 pD3DDevice) загнать результат двух матриц в один массив и возвращать его;

ээ...  Вопрос непонятен, ты же и так передаёшь матрицы через параметры. А что мешает вовсе убрать параметры (D3DXMATRIX MV, D3DXMATRIX MP) и вызвать функции составления матриц прямо внутри  CreatePyramid ?



Цитата
Мы в функции void Camera::CreatePyramid(D3DXMATRIX MV, D3DXMATRIX MP) матрицу вида умножаем на матрицу проекции.

Я понимаю что мы получаем общую матрицу и для чего они нужны в отдельности:
1. Матрица вида - отвечает за то, какая часть сцены будет видна на экране.
2. Матрица проекции - отвечает за то, как трехмерные координаты будут преобразованы в двумерные для отображения на экран.

А что даёт перемножение этих матриц не понимаю?

я , вообще говоря, тормознулся в изучении - времени нету. А пирамидой не заморачивался - она мне не нужна Улыбаюсь Ты же где то алгоритм брал, там, видать, некая геометрия высчитывается. Работает ? Не трожь (с)  Отлично
Вникать в пирамиду не хочется щас
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #114 : 30-07-2009 16:03 » 

Алексей1153++

Значит ты предлагаешь код функции getViewMatrix добавить к коду функции CreatePyramid, я правельно понял?

Хотя в книге автора Алена Торна написано так:

Код:
// Создание усечённой пирамиды
CreatePyramid(LPDIRECT3DDEVICE9 pD3DDevice)
{
       D3DXMATRIX Matrix, ViewMatrix, ProjectionMatrix;
       pD3DDevice->GetTransform(D3DTS_VIEW, &ViewMatrix);
       pD3DDevice->GetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
       D3DXMatrixMultiply(&Matrix, &ViewMatrix, &ProjectionMatrix);

        // Левая плоскость
        mPlanes[0].a = Matrix._14 + Matrix._13;
        mPlanes[0].b = Matrix._24 + Matrix._23;
        mPlanes[0].c = Matrix._34 + Matrix._33;
        mPlanes[0].d = Matrix._44 + Matrix._43;
        D3DXPlaneNormalize(&mPlanes[0], &mPlanes[0]);

        // Правая плоскость
        mPlanes[1].a = Matrix._14 - Matrix._13;
        mPlanes[1].b = Matrix._24 - Matrix._23;
        mPlanes[1].c = Matrix._34 - Matrix._33;
        mPlanes[1].d = Matrix._44 - Matrix._43;
        D3DXPlaneNormalize(&mPlanes[1], &mPlanes[1]);
                          
        // Верхняя плоскость
        mPlanes[2].a = Matrix._14 + Matrix._11;
        mPlanes[2].b = Matrix._24 + Matrix._21;
        mPlanes[2].c = Matrix._34 + Matrix._31;
        mPlanes[2].d = Matrix._44 + Matrix._41;
        D3DXPlaneNormalize(&mPlanes[2], &mPlanes[2]);

        // Нижняя плоскость
        mPlanes[3].a = Matrix._14 - Matrix._11;
        mPlanes[3].b = Matrix._24 - Matrix._21;
        mPlanes[3].c = Matrix._34 - Matrix._31;
        mPlanes[3].d = Matrix._44 - Matrix._41;
        D3DXPlaneNormalize(&mPlanes[3], &mPlanes[3]);
      
        // Ближняя плоскость
        mPlanes[4].a = Matrix._14 + Matrix._12;
        mPlanes[4].b = Matrix._24 + Matrix._22;
        mPlanes[4].c = Matrix._34 + Matrix._32;
        mPlanes[4].d = Matrix._44 + Matrix._42;
        D3DXPlaneNormalize(&mPlanes[4], &mPlanes[4]);
      
        // Дальняя плоскость
        mPlanes[5].a = Matrix._14 - Matrix._12;
        mPlanes[5].b = Matrix._24 - Matrix._22;
        mPlanes[5].c = Matrix._34 - Matrix._32;
        mPlanes[5].d = Matrix._44 - Matrix._42;
        D3DXPlaneNormalize(&mPlanes[5], &mPlanes[5]);
}

То есть матрицы вида и проекции изночально пусты я правельно понимаю или они должны переходить от функции getViewMatrix к функции CreatePyramid?

Я уже вообще запутался(((.
« Последнее редактирование: 30-07-2009 18:24 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #115 : 30-07-2009 16:14 » 

не, я не предлагаю туда код добавлять. Их оттуда просто вызвать надо и заполнить те изначально пустые матрицы Улыбаюсь
А вообще, вбей пока на эту пирамиду - вот далась она тебе...
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #116 : 30-07-2009 16:23 » 

Алексей1153++

То есть ты считаешь что это уже не основы DirectX, а более сложные вещи и мне нужно приостановить изучение этого алгоритма и перейти временно к более простым вещам?

Возможно ты и прав, но я постараюсь всё же перейти к более простым вещам не забывая об усечённой пирамиде и по мер появление интересной информации её здесь выкладывать.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #117 : 30-07-2009 17:47 » 

нет, я считаю, что это частности. Их всегда можно оставить на потом, когда будешь шлифовать производительность движка Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #118 : 30-07-2009 18:07 » 

Алексей1153++

Понял тебя, к стати я выяснил за чем нужно перемножение матриц вида и проекции.

Матрица вида - задает положение и орентацию усечённой пирамиды.
Матрица проекции -  задаёт размер усечённой пирамиды.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #119 : 31-07-2009 07:34 » 

Цитата: zuze
Что нужно сделать что бы я мог передать в функцию void Camera::CreatePyramid(D3DXMATRIX MV, D3DXMATRIX MP) значения матриц вида и проекции?

Я разобрался с этим вопросом

Методом GetTransform возвращает матрицы если они даже были обявлены и установлены в другой функции, так как у них один указатель на устройство Direct3D.

В обычном С и С++ (основах) такого не было, если объявил и инициализировал значения переменных в одной функции, то их ты должен вернуть чтобы использовать в другой функции или объявить их глобально. Вот я и запутался))).

Для илюстрации этого

Код:
void Camera::getViewMatrix(LPDIRECT3DDEVICE9 pD3DDevice)
{
     ...
     ...
     ...
     pD3DDevice->SetTransform(D3DTS_VIEW, &ViewMatrix);
     ...
     ...
     ...
     pD3DDevice->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
}

void Camera::CreatePyramid(LPDIRECT3DDEVICE9 pD3DDevice)
{
     D3DXMATRIX Matrix, ViewMatrix, ProjectionMatrix;
     pD3DDevice->GetTransform(D3DTS_VIEW, &ViewMatrix);
     pD3DDevice->GetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
     D3DXMatrixMultiply(&Matrix, &ViewMatrix, &ProjectionMatrix);
     ...
     ...
     ...
}
Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines