извини, я не могу скомпилить твое чудо а запускаться оно не хочет прикрепи хотя бы этот реликт который называется irvine32.inc и irvine32.lib
Ошибки есть, и ошибки не только в матрицах Все из-за невнимательности. Итак по порядку: 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 прилепить кстати, дельфи у меня тоже не в почете и на вопросы связанные с ним отвечать вряд ли буду, извините
А на счёт d3dx9sab.dll если к ней не лежит душа можно поменять сдесь ADDRESSES_DATA.INC строка DLL_D3DX9SAB BYTE "D3DX9SAB.DLL", 0
Да не вопрос. В том же самом топике, давным давно, когда заполняли структуру для клавиатуры. Ссылку я уже давал, но вот еще раз на всякий случай, посмотри здесь.
Хммм... Движение с помощью клавиатуры реализовано! Но, почему-то нет прироста мышки. Опять что-то не верно?
А почему прирост по любой из координат, который возвращает directinput загружается в стек сопроцессора командо fld? это ведь целое число, а стало быть нужно использовать fild. Не забудь предварительно поделить его еще некий коэффициент, а то сумма будет расти слишком быстро
Навигация по сцене - задача сферической геометрии. Не могу вспомнить эти формулы... Да конечно мы получаем от мышки прирост к углу наклона относительно осей 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.
вот рабочий пример. Код (Text): void HandleControls() { double PI = 3.14f; static long xCurPosOld = 0, yCurPosOld = 0; static float WalkBiasAngle = 0.0f; float Speed = (KeysState[VK_SHIFT])?3.06f:0.03f; float Bias = (KeysState[VK_SHIFT])?10.0f:20.0f; POINT Point; GetCursorPos(&Point); VertAngle += (yCurPosOld-Point.y)*0.09f; HorizAngle -= (xCurPosOld-Point.x)*0.09f; if(VertAngle < -45.0) VertAngle = -45.0; if(VertAngle > 90.0) VertAngle = 90.0; if(HorizAngle < 0.0) HorizAngle = 359.0; if(HorizAngle > 359.0) HorizAngle = 0.0; if( GetAsyncKeyState(VK_LEFT) < 0) { CameraZ += (float)sin((HorizAngle/180)*PI) * Speed / 1.5f; CameraX += (float)cos((HorizAngle/180)*PI) * Speed / 1.5f; } if( GetAsyncKeyState(VK_RIGHT) < 0) { CameraZ -= (float)sin((HorizAngle/180)*PI) * Speed / 1.5f; CameraX -= (float)cos((HorizAngle/180)*PI) * Speed / 1.5f; } if( GetAsyncKeyState(VK_UP) < 0 ) { CameraZ += (float)sin(((HorizAngle+90)/180)*PI) * Speed; CameraX += (float)cos(((HorizAngle+90)/180)*PI) * Speed; if (WalkBiasAngle >= 359.0f) { WalkBiasAngle = 0.0f; } else WalkBiasAngle += (10 + 100*Speed); WalkBias = (float)sin(WalkBiasAngle * PI / 180)/Bias; } if( GetAsyncKeyState(VK_DOWN) < 0 ) { CameraZ += (float)sin(((HorizAngle-90)/180)*PI) * Speed; CameraX += (float)cos(((HorizAngle-90)/180)*PI) * Speed; if (WalkBiasAngle < 1.0f) WalkBiasAngle = 359.0f; else WalkBiasAngle -= (10 + 100*Speed); WalkBias = (float)sin(WalkBiasAngle * PI / 180)/Bias; } if (CameraX < -500.0f) CameraX = -500.0f; if (CameraX > 500.0f) CameraX = 500.0f; if (CameraZ < -500.0f) CameraZ = -500.0f; if (CameraZ > 500.0f) CameraZ = 500.0f; if(Point.x==Width-1) { Point.x = 1; SetCursorPos(Point.x,Point.y); } if(Point.y==Height-1) { Point.y = 1; SetCursorPos(Point.x,Point.y); } if(Point.x==0) { Point.x = Width; SetCursorPos(Point.x,Point.y); } if(Point.y==0) { Point.y = Height; SetCursorPos(Point.x,Point.y); } xCurPosOld = Point.x; yCurPosOld = Point.y; }
Ну, насколько я вижу, тут тоже реализована навигация без оси 0Y... А формулы сферической геометрии может кто сказать? Если известны 2 угла наклона вектор-радиуса относительно осей 0X и 0Z как узнать угол наклона относительно 0Y?