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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Nicl
 Аватар для Nicl
0 / 0 / 0
Регистрация: 07.10.2008
Сообщений: 26
11.04.2009, 13:53     Выделение объекта щелчком мыши - DirectX9 #1
Здравствуйте.
Возникла - проблема - не могу реализовать обработку щелчка мыши по объекту.
Среда - 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++ Где скачать DirectX9 SDK???
динамическое выделение C++
C++ DirectX9 Direct3D
C++ Выделение памяти (new)
Выделение памяти C++
Выделение памяти C++
Динамическое выделение памяти для объекта класса C++
C++ Выделение массивов в ДП
Как выглядит изнутри динамическое выделение объекта через new? C++
C++ выделение памяти
C++ Первый опыт с DirectX9. Странное поведение программы
В какой момент вызывается конструктор для глобального объекта, использующего статическое выделение памяти? C++

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

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

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