Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Nicl
0 / 0 / 0
Регистрация: 07.10.2008
Сообщений: 26
#1

Выделение объекта щелчком мыши - DirectX9 - C++

11.04.2009, 13:53. Просмотров 1054. Ответов 0
Метки нет (Все метки)

Здравствуйте.
Возникла - проблема - не могу реализовать обработку щелчка мыши по объекту.
Среда - DirectX9 и C++.

Собственно выделение не составляет проблемы - нужно лишь обнаружить "попадание" курсора в объект. В сети есть немало обсуждений и даже фрагментов решения, но ничего сделать я толком так и не смог.

Вот функции, за это дело отвечающие:
отсюда

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
void GetCurRay(HWND       *hwnd, // хэндлер окна
               D3DXMATRIX matWorld, // мировая матрица
               D3DXMATRIX matView,  // матрица вида              
               D3DXMATRIX matProj,  // матрица проекции
               short int rezW, // текущее разрешение окна
               short int rezH,
 
               // выходные параметры
               D3DXVECTOR3 *vPickRayDir,  // направление луча
               D3DXVECTOR3 *vPickRayOrig )// начало луча
{
 
        POINT ptCursor;
        GetCursorPos( &ptCursor ); //получаем текущие координаты курсора 
 
        ScreenToClient(*hwnd, &ptCursor ); // корректируем координаты с учетом расположения окна
 
        // Compute the vector of the pick ray in screen space
        // вычисляем вектор направления нашего щелчка с учетом матрицы проекции
        D3DXVECTOR3 v;
        v.x =  ( ( ( 2.0f * ptCursor.x ) / rezW ) - 1 ) / matProj._11;
        v.y = -( ( ( 2.0f * ptCursor.y ) / rezH ) - 1 ) / matProj._22;
        v.z =  1.0f;
 
        // Get the inverse view matrix
        // получаем инвертированную видовую матрицу
        D3DXMATRIX mWorldView = matWorld * matView;
        D3DXMATRIX m;
        D3DXMatrixInverse( &m, NULL, &mWorldView );
 
        // Transform the screen space pick ray into 3D space
        // трансформируем координату щелчка мыши и направление в трехмерное пространство
        vPickRayDir->x  = v.x*m._11 + v.y*m._21 + v.z*m._31;
        vPickRayDir->y  = v.x*m._12 + v.y*m._22 + v.z*m._32;
        vPickRayDir->z  = v.x*m._13 + v.y*m._23 + v.z*m._33;
        vPickRayOrig->x = m._41;
        vPickRayOrig->y = m._42;
        vPickRayOrig->z = m._43;
}
 
 
 
 
 
void MouseInput( HWND g_hWnd )
{      
    D3DXVECTOR3 vPickRayDir;
    D3DXVECTOR3 vPickRayOrig;
 
    //проверяем был ли щелчок мыши
    if( GMousing)
    {
        
        GetCurRay(&g_hWnd, matWorld,matView,matProj,800,600,&vPickRayDir,&vPickRayOrig);        
        BOOL cool = false;
        D3DXIntersect(pMesh,&vPickRayOrig,&vPickRayDir,&cool,NULL,NULL,NULL,NULL,NULL,NULL);
        GMousing = false;
    
        if (cool == 1)  
        {
        
            select_obj = 2;//объект выделен
        }
    }
}
Функция MouseInput вызывается перед Render.
C++
1
2
3
4
5
6
7
8
9
10
11
if (PeekMessage (&msg,NULL,0,0,PM_REMOVE))
            {
 
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            }
            else
            {
                MouseInput(hwnd);
                Render();
            }
Но вот объект упорно не желает выделятся. Отчего? В примере все работает, но у меня отчего-то нет.

И вопрос номер два, не менее важный - как провести аналогичную обработку клика для обычного куба из вершин, а не mesh-объекта?

Добавлено через 14 часов 2 минуты 51 секунду
Итак, пока ничего так и не вышло. Координаты мыши вроде правильные, вектора некорректными не показались - да и работает оно ж в примере. Щелчок определяется, но переменная "попадания" - cool - равна нулю.
Подайте хоть идею - чего может не хватать? Может как-то не так mesh определен?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
HRESULT InitMesh() {
    if (FAILED (D3DXLoadMeshFromX("scannerarm.x",D3DXMESH_SYSTEMMEM,pDevice, NULL, &pBuffer, NULL, &dwNum, &pMesh))) {
        return E_FAIL;
    }
    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pBuffer->GetBufferPointer();
    pMeshMaterial = new D3DMATERIAL9[dwNum];
    pMeshTextures = new LPDIRECT3DTEXTURE9[dwNum];
    for (DWORD i = 0; i<dwNum; i++)
    {
        pMeshMaterial[i] = d3dxMaterials[i].MatD3D;
        pMeshMaterial[i].Ambient = pMeshMaterial[i].Diffuse;
        if (FAILED(D3DXCreateTextureFromFile(pDevice,d3dxMaterials[i].pTextureFilename,&pMeshTextures[i])))
        {
            pMeshTextures[i] = NULL;
        }
    }
    pBuffer ->Release();
    return S_OK;
}
 
 
VOID DrawMesh()
{
    for (DWORD i = 0; i<dwNum; i++)
    {
        pDevice->SetMaterial(&pMeshMaterial[i]);
        pMesh->DrawSubset(i);
    }
}
Который день уже бьюсь. Очень нужна помощь.

Добавлено через 50 минут 25 секунд
--------------------------------
Ураураура.

Ошибка была в настройке матриц, как я изначально и подозревал. В чем она заключалась увы так толком и не понял - но теперь остался только один вопрос:

Как выделить объект типа куб, построенный с помощью вершин? С мешем разобрался, но функция D3DXIntersect требует переменную LPD3DXBASE MESH pMesh.
Как быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2009, 13:53     Выделение объекта щелчком мыши - DirectX9
Посмотрите здесь:

Динамическое выделение памяти для объекта класса - C++
Скажите в чем отличие между A *ptr=new A() и A *ptr=new A;

Как выглядит изнутри динамическое выделение объекта через new? - C++
То есть на Си будет выглядеть так : struct T { int x, y; }; /* Эта процедура является отображением конструктора...

В какой момент вызывается конструктор для глобального объекта, использующего статическое выделение памяти? - C++
В какой момент вызывается конструктор для глобального объекта, использующего статическое выделение памяти?

DirectX9 Direct3D - C++
Здравствуйте! Возникла проблема: При загрузке х. файлов из пакета ДиректХ все нормально (тот же самый тигр). Но если я експортирую из...

Где скачать DirectX9 SDK??? - C++
Где скачать DirectX9 SDK??? И еще вопросик чем лучше пользоваться новичку в графике? DirectX или OpenГл

Первый опыт с DirectX9. Странное поведение программы - C++
Решил начать осваивать DirectX. Взял код из этого урока, где рисуется треугольник ...

Не выделение памяти - C++
По какой причине не работает это программа ? #include&lt;iostream&gt; #include &lt;string&gt; using namespace std; int main () ...

Выделение памяти - C++
Вот кусок кода, класс и функция добавления в список Класс занимает 64 бита, я добавляю 10 элементов в список - 640 бит Потом отнимаю...

Выделение памяти - C++
Платформа и компилятор x64. Установлено 64Gb ОЗУ, 60Gb из них откусил SQL Server. Пытаюсь сделать следующее: struct Dictionary { ...

Выделение памяти - C++
Какой суммарный объем памяти в байтах будут занимать поля CObj всех объектов класса CEx в этой программе: class CEx {public: static...

выделение памяти - C++
есть класс множество. необходимо создать класс &quot;правило&quot;, одним из методов которого является добавление множества к соответствующему списку...

Выделение памяти - C++
int main() { FILE *fIn = NULL, *fOut =NULL; Error EMyError; CNodeStack *Start; CNodeStack *ListF = new CNodeStack; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru