Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2013, 11:33   #1
Grand_Daddy
Пользователь
 
Регистрация: 01.05.2012
Сообщений: 14
По умолчанию Неправильно реализую луч.

Здравствуйте! В общем вот ситуация:
Есть 3D мир, есть камера(WASD - думаю объяснять не надо, CTRL и SPACE - вверх вниз, если зажимаем правую кнопку мыши, то поворачивается камера(как в играх), если не зажата, то курсором можно выбирать что-либо на экране).
В чем проблема: нужно правильно реализовать луч при нажатии левой кнопки мыши от моей позиции и в позицию щелчка мыши. Начало луча в положение камеры ( это я сделал), а вот проблема у меня с направлением луча. Не понимаю, как надо запрограммировать напраление луча при нажатии левой кнопки мыши. Я реализовал, но не правильно. Код ниже.
Код:
float x_mouse = 0, y_mouse = 0;
      if (msg.message == WM_LBUTTONDOWN)
      {      
        d3d::Ray ray = CalcPickingRay(LOWORD(msg.lParam), HIWORD(msg.lParam));// получаем координаты мыши в момент нажатия ЛКМ и высчитываем луч. Полный код функции ниже.
        D3DXMATRIX view;
        Device->GetTransform(D3DTS_VIEW, &view);
        D3DXMATRIX viewInverse;
        D3DXMatrixInverse(&viewInverse,  0, &view);
        TransformRay(&ray, &viewInverse);// полный код этой функции ниже.
                               ......
                         }
//=================
//=================
//=================
d3d::Ray CalcPickingRay(int x, int y)
{
     float px = 0.0f;
     float py = 0.0f;

     D3DVIEWPORT9 vp;
     Device->GetViewport(&vp);

     D3DXMATRIX proj;
     Device->GetTransform(D3DTS_PROJECTION, &proj);

     px = ((( 2.0f*x) / vp.Width)  - 1.0f) / proj(0, 0);
     py = (((-2.0f*y) / vp.Height) + 1.0f) / proj(1, 1);

     d3d::Ray ray;
     ray._origin = _pos;// _origin - местоположение луча
   ray._direction = D3DXVECTOR3(px, py, _look.z);//_direction - направление луча. Вот тут как мне кажется ошибка. "px" и "py" рассчитываются верно вроде бы, а вот что именно надо поставить на место Z координаты? Сейчас у меня на месте Z координаты Z-направление взгляда камеры.
     return ray;
}

void TransformRay(d3d::Ray* ray, D3DXMATRIX* T)
{
     // Преобразование начальной точки луча, w = 1.
     D3DXVec3TransformCoord(
          &ray->_origin,
          &ray->_origin,
          T);

     // Преобразование вектора направления луча, w = 0.
     D3DXVec3TransformNormal(
          &ray->_direction,
          &ray->_direction,
          T);

     // Нормализация вектора направления
     D3DXVec3Normalize(&ray->_direction, &ray->_direction);
}
Скидываю EXE файл чтобы вы могли лучше понять о чем я собственно говорю. Луч я визуализировал прямой линией, где начало его в положении камеры, а конец в позиции, куда, по идее он должен смотреть.
И да, как запустите ЕХЕ файл то нажмите S чтобы чуть-чуть отъехать назад. Для ориентации в пространстве рисую кубик и его положение совпадает с камерой поэтому его не видно сразу.
http://yadi.sk/d/XFv1Oi2C2LXu2
Grand_Daddy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему неправильно? Tolian92 Паскаль, Turbo Pascal, PascalABC.NET 0 27.03.2012 02:04
Неправильно отображается сайт zayabelka HTML и CSS 4 18.12.2011 22:12
TextRect работает неправильно bbk_serg БД в Delphi 16 10.08.2010 21:11
Че неправильно! HixoH Общие вопросы C/C++ 0 23.12.2009 15:04
что неправильно? helavisa Общие вопросы C/C++ 18 02.06.2009 17:51