Fasm Directx 10 проблема с выбором 3д объекта. Кто решил эту проблему.

Тема в разделе "WASM.DirectX", создана пользователем Ronniko, 13 окт 2010.

  1. Ronniko

    Ronniko New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2009
    Сообщения:
    21
    Нужна помощь.
     
  2. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Ronniko
    подробнее надо писать
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Ronniko
    Вам помощь нужна для правильной формулировки вопроса?
     
  4. Ronniko

    Ronniko New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2009
    Сообщения:
    21
    Меня интерисуют те кто сделал выбор 3Д объекта с помощью мыши. И как они это сделали (показать на примере кода программы).
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Ronniko
    Либо в гугл, либо покажите ваш код, который не работает, либо в коммерц.
     
  6. Ronniko

    Ronniko New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2009
    Сообщения:
    21
    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д планку. И получается так , когда планка с буквой у самого левого края монитора и я навожу мышь на изображение этой планки (а точнее на левый край планки , то бищ ее начало) то все замечательно совпадает. А с перемещением планки к центру экрана мыш попадает по планке только ближе к центру планки. Т. е. я навужу к краю планки мышь и нет совпадения . А когда мышь на центре планки тогда есть совпадение. Вобщем как мне сделать что бы всегда в любом месте экрана, я наводил мышь на начало планки(левый край планки) и у меня происходило совпадение с координатами мыши.
    И если можешь подскажи в чем я ошибаюсь или действую не правильно.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ronniko
    Читайте SDK. Обращаете трансформацию экранной координаты мыши в 3D(получаете 3D луч) и находите пересечение с объектом. В SDK вроде даже пример был.
     
  8. Ronniko

    Ronniko New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2009
    Сообщения:
    21
    Так вот вся проблема втом что не пойму что дает rayDirection и rayOrigin и как они используются.
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ronniko
    Что вам конкретно не понятно? Как работает D3DXVec3TransformCoord?
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Используйте D3DXVec3Project или D3DXVec3Unproject и всё будет работать как надо.
     
  12. Ronniko

    Ronniko New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2009
    Сообщения:
    21
    Мне непонятно вот этот пример из 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;
    }
     
  13. Ronniko

    Ronniko New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2009
    Сообщения:
    21
    Если можно перевести координаты левой верхней вершины3Д объекта в координаты экрана, то тогда вопрос как это сделать?
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Можно, используйте D3DXVec3Project. Если нужно наоборот, перевести экранные координаты в 3D, тогда D3DXVec3Unproject. Только насчёт левой верхней это вряд ли, перевести 3D кооординату в экранную это пожалуйста.