Меня интерисуют те кто сделал выбор 3Д объекта с помощью мыши. И как они это сделали (показать на примере кода программы).
1 GetCursorPos, mousePosit получаю обычные координаты мыши. 2 Потом перевожу мышинные координаты в 3Д вот так : Mx=(2*MouseX/Ширина экрана (у меня 1680)-1)/ Projection._11 rayDirect vector Mx,0.0,1.0 rayOrig 0.0,0.0,0.0 inverseW D3DXMatrix D3DXMatrixInverse,inverseW, 0, Wplanka D3DXVec3TransformCoord,rayOrig, rayOrig, inverseW D3DXVec3TransformNormal,rayDirect, rayDirect, inverseW 3 Так я получаю числа (когда двигаю мышью от -0.920 до +0.914) Wplanka это матрица для планки. Точно так же я перевожу координаты текста в 3д координаты. А так как я тоже для координат текста получаю числа от -0.920 до +0.914. Я делю координату текста на 0.005376 и это дает диапазон в 3Д координатах. Я эксперементировал и находил (подбирая вручную числа для минимума x и максимума. У меня минимум -170.2 а максимум 170.0). И делая диление на число 0.005376 я получаю такиеже числа. Я пытаюсь сравнивать координаты миши с координатами текста. Но координаты мыши и текста я перевожу в 3д координаты. Делаю это потому что печатаю буквы с помощью планок и поэтому делаю эти преобразования что бы 2д координаты текста совпадали с 3д изображением на экране. Так вот проблема втом ,что чем ближе планка с буквой к центру экрана , тем сильнее координаты мыши (которые я перевел в 3Д) опережают 3д планку. И получается так , когда планка с буквой у самого левого края монитора и я навожу мышь на изображение этой планки (а точнее на левый край планки , то бищ ее начало) то все замечательно совпадает. А с перемещением планки к центру экрана мыш попадает по планке только ближе к центру планки. Т. е. я навужу к краю планки мышь и нет совпадения . А когда мышь на центре планки тогда есть совпадение. Вобщем как мне сделать что бы всегда в любом месте экрана, я наводил мышь на начало планки(левый край планки) и у меня происходило совпадение с координатами мыши. И если можешь подскажи в чем я ошибаюсь или действую не правильно.
Ronniko Читайте SDK. Обращаете трансформацию экранной координаты мыши в 3D(получаете 3D луч) и находите пересечение с объектом. В SDK вроде даже пример был.
Мне непонятно вот этот пример из SDK directx 9(мало того что кучу преобразований делают с нахождение rayDirect и rayOrigin, так еще эта фигня которая определяет пересечение с 3Д объектом. Нафига так сложно? Не ужели проще нет способа? Типа перевести координаты левой верхней вершины объекта в 2Д координаты и сравнить их с координатами мыши? Разве такое нельзя реализовать? ): bool ПересечениеTriangle( const D3DXVECTOR3& orig, const D3DXVECTOR3& dir, D3DXVECTOR3& v0, D3DXVECTOR3& v1, D3DXVECTOR3& v2, FLOAT* t, FLOAT* u, FLOAT* v ) { // Find vectors for two edges sharing vert0 D3DXVECTOR3 edge1 = v1 - v0; D3DXVECTOR3 edge2 = v2 - v0; // Begin calculating determinant - also used to calculate U parameter D3DXVECTOR3 pvec; D3DXVec3Cross( &pvec, &dir, &edge2 ); // If determinant is near zero, ray lies in plane of triangle FLOAT det = D3DXVec3Dot( &edge1, &pvec ); D3DXVECTOR3 tvec; if( det > 0 ) { tvec = orig - v0; } else { tvec = v0 - orig; det = -det; } if( det < 0.0001f ) return FALSE; // Calculate U parameter and test bounds *u = D3DXVec3Dot( &tvec, &pvec ); if( *u < 0.0f || *u > det ) return FALSE; // Prepare to test V parameter D3DXVECTOR3 qvec; D3DXVec3Cross( &qvec, &tvec, &edge1 ); // Calculate V parameter and test bounds *v = D3DXVec3Dot( &dir, &qvec ); if( *v < 0.0f || *u + *v > det ) return FALSE; // Calculate t, scale parameters, ray intersects triangle *t = D3DXVec3Dot( &edge2, &qvec ); FLOAT fInvDet = 1.0f / det; *t *= fInvDet; *u *= fInvDet; *v *= fInvDet; return TRUE; }
Если можно перевести координаты левой верхней вершины3Д объекта в координаты экрана, то тогда вопрос как это сделать?
Можно, используйте D3DXVec3Project. Если нужно наоборот, перевести экранные координаты в 3D, тогда D3DXVec3Unproject. Только насчёт левой верхней это вряд ли, перевести 3D кооординату в экранную это пожалуйста.