DirectInput - проблема

Тема в разделе "WASM.DirectX", создана пользователем Холод, 16 июл 2006.

  1. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    может всё-таки матрицы...
     
  2. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    извини, я не могу скомпилить твое чудо :) а запускаться оно не хочет
    прикрепи хотя бы этот реликт который называется irvine32.inc и irvine32.lib
     
  3. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Ах да, для запуска нужна библиотека D3DX9SAB.DLL
    А вот и реликт :)
     
  4. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
  5. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Ошибки есть, и ошибки не только в матрицах :) Все из-за невнимательности. Итак по порядку:

    1. Матрицы собраны правильно. Однако я бы не стал оставлять пустыми вектора eye и lookat при построении матрицы lookatLH

    2. То что матрица world единичная это верно. Но... ты указываешь при установке всех трех матриц одну и туже world (MOVE_CONTROLLER.MATRIX_WORLD)

    3. Неверные значения в стеке при вызове метода Clear и функции D3DXMatrixPerspectiveFovLH. Заносить нужно числа с плавающей запятой (10000.0f) а не просто числа 10000 или 1

    а починяется все просто:
    ----------------------------------
    1. в стек занести 1.0f <= Clear
    2. в стек занести 10000.0f и 1.0f <= D3DXMatrixPerspectiveFovLH
    3. установить <0.0f, 0.0f, -10.0f> <= D3DVECTOR_UP
    4. установить <0.0f, 0.0f, 0.0f> <= D3DVECTOR_LOOKAT
    5. поправить в SetTransform offset нужной матрицы

    вроде бы ничего не забыл....

    а, да, еще использование d3dx9sab.dll от проектов на delphi как то странно, обычно можно ту же d3dx9d.dll прилепить

    кстати, дельфи у меня тоже не в почете и на вопросы связанные с ним отвечать вряд ли буду, извините :)
     
  6. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Спасибо большое, Миха! Всё получилось!
     
  7. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    А на счёт d3dx9sab.dll если к ней не лежит душа можно поменять сдесь ADDRESSES_DATA.INC
    строка DLL_D3DX9SAB BYTE "D3DX9SAB.DLL", 0
     
  8. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    исходники я читаю внимательно :) так и сделал при первой компиляции
     
  9. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Доброе утро! Увожаемый KeYMax, подскажите как правильно заполнить DIDATAFORMAT для мышки.
     
  10. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Да не вопрос. В том же самом топике, давным давно, когда заполняли структуру для клавиатуры. Ссылку я уже давал, но вот еще раз на всякий случай, посмотри здесь.
     
  11. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Хммм... Движение с помощью клавиатуры реализовано! Но, почему-то нет прироста мышки. Опять что-то не верно?
     
  12. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    А почему прирост по любой из координат, который возвращает directinput загружается в стек сопроцессора командо fld? это ведь целое число, а стало быть нужно использовать fild. Не забудь предварительно поделить его еще некий коэффициент, а то сумма будет расти слишком быстро
     
  13. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    keYMax, ты гений!
     
  14. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Навигация по сцене - задача сферической геометрии. Не могу вспомнить эти формулы...
    Да конечно мы получаем от мышки прирост к углу наклона относительно осей 0X и 0Y. Но как правильно высчитать синусы и косинусы.
    Сколько не пытался, корректно не выходит, вернее выходит, но формулы не те, что надо. А проблемы с 0Y осью. Я делаю так:

    Вот взгляни на следующий псевдокод: -----------------------

    получаем прирост к углам: ---------------------------------
    MOVE_CONTROLLER.LOOK_XANGLE = MOVE_CONTROLLER.LOOK_XANGLE + (DIMOUSESTATE2.lX / MOUSE_SENSIVITY)
    MOVE_CONTROLLER.LOOK_YANGLE = MOVE_CONTROLLER.LOOK_YANGLE + (DIMOUSESTATE2.ly / MOUSE_SENSIVITY)
    -----------------------------------------------------------

    обработка клавиатуры: -------------------------------------
    DIK_UP: MOVE_CONTROLLER.D3DVECTOR_EYE.x = MOVE_CONTROLLER.D3DVECTOR_EYE.x + (INCREASE * Sin(MOVE_CONTROLLER.LOOK_XANGLE))
    MOVE_CONTROLLER.D3DVECTOR_EYE.z = MOVE_CONTROLLER.D3DVECTOR_EYE.z + (INCREASE * Cos(MOVE_CONTROLLER.LOOK_XANGLE))

    DIK_DOWN: MOVE_CONTROLLER.D3DVECTOR_EYE.x = MOVE_CONTROLLER.D3DVECTOR_EYE.x + (INCREASE * Sin(MOVE_CONTROLLER.LOOK_XANGLE + PI))
    MOVE_CONTROLLER.D3DVECTOR_EYE.z = MOVE_CONTROLLER.D3DVECTOR_EYE.z + (INCREASE * Cos(MOVE_CONTROLLER.LOOK_XANGLE + PI))

    DIK_LEFT: MOVE_CONTROLLER.D3DVECTOR_EYE.x = MOVE_CONTROLLER.D3DVECTOR_EYE.x + (INCREASE * Sin(MOVE_CONTROLLER.LOOK_XANGLE - (PI / 2)))
    MOVE_CONTROLLER.D3DVECTOR_EYE.z = MOVE_CONTROLLER.D3DVECTOR_EYE.z + (INCREASE * Cos(MOVE_CONTROLLER.LOOK_XANGLE - (PI / 2)))

    DIK_RIGHT: MOVE_CONTROLLER.D3DVECTOR_EYE.x = MOVE_CONTROLLER.D3DVECTOR_EYE.x + (INCREASE * Sin(MOVE_CONTROLLER.LOOK_XANGLE + (PI / 2)))
    MOVE_CONTROLLER.D3DVECTOR_EYE.z = MOVE_CONTROLLER.D3DVECTOR_EYE.z + (INCREASE * Cos(MOVE_CONTROLLER.LOOK_XANGLE + (PI / 2)))
    -----------------------------------------------------------

    вычислить координаты единичного ветор-радиуса: ------------
    MOVE_CONTROLLER.D3DVECTOR_LOOKAT.x = Sin(MOVE_CONTROLLER.LOOK_XANGLE) + MOVE_CONTROLLER.D3DVECTOR_EYE.x
    MOVE_CONTROLLER.D3DVECTOR_LOOKAT.z = Cos(MOVE_CONTROLLER.LOOK_XANGLE) + MOVE_CONTROLLER.D3DVECTOR_EYE.z
    MOVE_CONTROLLER.D3DVECTOR_LOOKAT.y = Sin(-MOVE_CONTROLLER.LOOK_YANGLE) + MOVE_CONTROLLER.D3DVECTOR_EYE.y
    -----------------------------------------------------------
    -----------------------------------------------------------

    Прилагается код: навигация по сцене без осматривания по оси 0Y.
     
  15. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
  16. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Знатоки отзовитесь...
     
  17. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.331
    вот рабочий пример.

    Код (Text):
    1. void HandleControls()
    2. {
    3.     double PI = 3.14f;
    4.     static long xCurPosOld = 0, yCurPosOld = 0;
    5.     static float WalkBiasAngle = 0.0f;
    6.     float Speed = (KeysState[VK_SHIFT])?3.06f:0.03f;
    7.     float Bias = (KeysState[VK_SHIFT])?10.0f:20.0f;
    8.    
    9.     POINT Point;
    10.     GetCursorPos(&Point);
    11.    
    12.     VertAngle += (yCurPosOld-Point.y)*0.09f;
    13.     HorizAngle -= (xCurPosOld-Point.x)*0.09f;
    14.    
    15.     if(VertAngle < -45.0) VertAngle = -45.0;
    16.     if(VertAngle > 90.0) VertAngle = 90.0;
    17.    
    18.     if(HorizAngle < 0.0) HorizAngle = 359.0;
    19.     if(HorizAngle > 359.0) HorizAngle = 0.0;
    20.    
    21.     if( GetAsyncKeyState(VK_LEFT) < 0)
    22.     {  
    23.         CameraZ += (float)sin((HorizAngle/180)*PI) * Speed / 1.5f;
    24.         CameraX += (float)cos((HorizAngle/180)*PI) * Speed / 1.5f;
    25.     }
    26.    
    27.     if( GetAsyncKeyState(VK_RIGHT) < 0)
    28.     {  
    29.         CameraZ -= (float)sin((HorizAngle/180)*PI) * Speed / 1.5f;
    30.         CameraX -= (float)cos((HorizAngle/180)*PI) * Speed / 1.5f;
    31.     }
    32.     if( GetAsyncKeyState(VK_UP) < 0 )
    33.     {  
    34.         CameraZ += (float)sin(((HorizAngle+90)/180)*PI) * Speed;
    35.         CameraX += (float)cos(((HorizAngle+90)/180)*PI) * Speed;
    36.        
    37.         if (WalkBiasAngle >= 359.0f)
    38.         {
    39.             WalkBiasAngle = 0.0f;
    40.         }
    41.         else WalkBiasAngle += (10 + 100*Speed);
    42.         WalkBias = (float)sin(WalkBiasAngle * PI / 180)/Bias;
    43.     }
    44.     if( GetAsyncKeyState(VK_DOWN) < 0 )
    45.     {
    46.         CameraZ += (float)sin(((HorizAngle-90)/180)*PI) * Speed;
    47.         CameraX += (float)cos(((HorizAngle-90)/180)*PI) * Speed;
    48.        
    49.         if (WalkBiasAngle < 1.0f) WalkBiasAngle = 359.0f;
    50.         else WalkBiasAngle -= (10 + 100*Speed);
    51.         WalkBias = (float)sin(WalkBiasAngle * PI / 180)/Bias;
    52.     }
    53.    
    54.     if (CameraX < -500.0f) CameraX = -500.0f;
    55.     if (CameraX > 500.0f) CameraX = 500.0f;
    56.    
    57.     if (CameraZ < -500.0f) CameraZ = -500.0f;
    58.     if (CameraZ > 500.0f) CameraZ = 500.0f;
    59.  
    60.     if(Point.x==Width-1)
    61.     {  
    62.         Point.x = 1;
    63.         SetCursorPos(Point.x,Point.y);
    64.     }
    65.     if(Point.y==Height-1)
    66.     {  
    67.         Point.y = 1;
    68.         SetCursorPos(Point.x,Point.y);
    69.     }
    70.     if(Point.x==0)
    71.     {  
    72.         Point.x = Width;
    73.         SetCursorPos(Point.x,Point.y);
    74.     }
    75.     if(Point.y==0)
    76.     {  
    77.         Point.y = Height;
    78.         SetCursorPos(Point.x,Point.y);
    79.     }
    80.    
    81.     xCurPosOld = Point.x;
    82.     yCurPosOld = Point.y;
    83. }
     
  18. Холод

    Холод New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    42
    Ну, насколько я вижу, тут тоже реализована навигация без оси 0Y...
    А формулы сферической геометрии может кто сказать? Если известны 2 угла наклона вектор-радиуса относительно осей 0X и 0Z как узнать угол наклона относительно 0Y?