Сообщения на форуме пользователя Andrey (217 стр.)
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно? | 5 мая 2005 | 18:18 | #9 |
---|
jm,all
вот последний вариант но он не работает :((((
вот последний вариант но он не работает :((((
void UpdateD3DCamera(Camera& cam) { //получить указатель на матрицу float *Matrix = cam.GetMatrix(); //получить направление взгляда Vector3D Direction = cam.GetDirection(); //получитьвектор правого направления Vector3D Right = cam.GetRight(); //получить вектор верхнего направления Vector3D Up = cam.GetUp(); //получить позицию Vector3D Position = cam.GetPosition(); Direction.Normalize(); //посчитать вектор права Right = Up * Direction; Right.Normalize(); //посчитать вектор верха Up = Direction * Right; Up.Normalize(); //установить вектор напрвления cam.SetDirection(Direction); //установить вектор верха cam.SetUp(Up); //установить вектор права cam.SetRight(Right); Matrix[0] = Right.x; Matrix[4] = Up.x; Matrix[8] = Direction.x; Matrix[1] = Right.y; Matrix[5] = Up.y; Matrix[9] = Direction.y; Matrix[2] = Right.z; Matrix[6] = Up.z; Matrix[10] = Direction.z; Matrix[12] = -dotProduct(Right, Position); Matrix[13] = -dotProduct(Up, Position); Matrix[14] = -dotProduct(Direction, Position); //применить преобразование pDevice -> SetTransform(D3DTS_VIEW , (D3DXMATRIX *)Matrix); }
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно? | 5 мая 2005 | 18:01 | #8 |
---|
jm
спасибо я попробовал но опять не работает...:(
чехарда со знаками из-за тоо что в OpenGL и Direct3D разные координатные системы...
спасибо я попробовал но опять не работает...:(
чехарда со знаками из-за тоо что в OpenGL и Direct3D разные координатные системы...
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно? | 5 мая 2005 | 15:29 | #6 |
---|
crazy25
вот так переделал все равно не работает :(
Какие есть еще идеи?
вот так переделал все равно не работает :(
void UpdateD3DCamera(Camera& cam) { //получить указатель на матрицу float *Matrix = cam.GetMatrix(); //получить направление взгляда Vector3D Direction = cam.GetDirection(); //получитьвектор правого направления Vector3D Right = cam.GetRight(); //получить вектор верхнего направления Vector3D Up = cam.GetUp(); //получить позицию Vector3D Position = cam.GetPosition(); Direction.Normalize(); //посчитать вектор права Right = Up * Direction; Right.Normalize(); //посчитать вектор верха Up = Direction * Right; Up.Normalize(); //установить вектор напрвления cam.SetDirection(Direction); //установить вектор верха cam.SetUp(Up); //установить вектор права cam.SetRight(Right); Matrix[0] = -Right.x; Matrix[4] = Up.x; Matrix[8] = Direction.x; Matrix[1] = -Right.y; Matrix[5] = Up.y; Matrix[9] = Direction.y; Matrix[2] = -Right.z; Matrix[6] = Up.z; Matrix[10] = Direction.z; Matrix[3] = -dotProduct(Right, -Position); Matrix[7] = -dotProduct(Up, -Position); Matrix[11] = dotProduct(Direction, -Position);*/ //применить преобразование pDevice -> SetTransform(D3DTS_VIEW , (D3DXMATRIX *)Matrix); }
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно? | 5 мая 2005 | 15:09 | #5 |
---|
crazy25
да ты не ошибаешься цитирую DirectX 9.0 SDK
да ты не ошибаешься цитирую DirectX 9.0 SDK
typedef struct _D3DMATRIX {
union {
struct {
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
};
} D3DMATRIX;
Спасибо поробую переделать.
_ij
An array of floats that represent a 4x4 matrix, where i is the row number and j is the column number. For example, _34 means the same as [a34].
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно? | 5 мая 2005 | 14:46 | #3 |
---|
crazy25
>У тебя заполнение матрицы происходит в обоих случаях одинаково, а у OpenGL порядок строк и столбцов матрицы не такой >как у DirectX.
т.е. берем и транспонируем?
>У тебя заполнение матрицы происходит в обоих случаях одинаково, а у OpenGL порядок строк и столбцов матрицы не такой >как у DirectX.
т.е. берем и транспонируем?
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно? | 5 мая 2005 | 14:30 | #1 |
---|
вот обновление камеры для OpenGL:
что у меня неправильно? спасибо всем заранее.
С уважением Андрей.
void UpdateOGLCamera(Camera& cam) { //получить указатель на матрицу float *Matrix = cam.GetMatrix(); //получить направление взгляда Vector3D Direction = cam.GetDirection(); //получитьвектор правого направления Vector3D Right = cam.GetRight(); //получить вектор верхнего направления Vector3D Up = cam.GetUp(); //получить позицию Vector3D Position = cam.GetPosition(); Direction.Normalize(); //посчитать вектор права Right = Direction * Up; Right.Normalize(); //посчитать вектор верха Up = Right * Direction; Up.Normalize(); //установить вектор напрвления cam.SetDirection(Direction); //установить вектор верха cam.SetUp(Up); //установить вектор права cam.SetRight(Right); Matrix[0] = Right.x; Matrix[1] = Up.x; Matrix[2] = -Direction.x; Matrix[4] = Right.y; Matrix[5] = Up.y; Matrix[6] = -Direction.y; Matrix[8] = Right.z; Matrix[9] = Up.z; Matrix[10] = -Direction.z; Matrix[12] = -dotProduct(Right, Position); Matrix[13] = -dotProduct(Up, Position); Matrix[14] = dotProduct(Direction, Position); //применить преобразование glLoadMatrixf(Matrix); }
вот обновление камеры для Direct3D:
void UpdateD3DCamera(Camera& cam) { //получить указатель на матрицу float *Matrix = cam.GetMatrix(); //получить направление взгляда Vector3D Direction = cam.GetDirection(); //получитьвектор правого направления Vector3D Right = cam.GetRight(); //получить вектор верхнего направления Vector3D Up = cam.GetUp(); //получить позицию Vector3D Position = cam.GetPosition(); Direction.Normalize(); //посчитать вектор права Right = Up * Direction; Right.Normalize(); //посчитать вектор верха Up = Direction * Right; Up.Normalize(); //установить вектор напрвления cam.SetDirection(Direction); //установить вектор верха cam.SetUp(Up); //установить вектор права cam.SetRight(Right); Matrix[0] = -Right.x; Matrix[1] = Up.x; Matrix[2] = Direction.x; Matrix[4] = -Right.y; Matrix[5] = Up.y; Matrix[6] = Direction.y; Matrix[8] = -Right.z; Matrix[9] = Up.z; Matrix[10] = Direction.z; Matrix[12] = -dotProduct(Right, -Position); Matrix[13] = -dotProduct(Up, -Position); Matrix[14] = dotProduct(Direction, -Position); //применить преобразование pDevice -> SetTransform(D3DTS_VIEW , (D3DXMATRIX *)Matrix); }
С уважением Андрей.
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно? | 5 мая 2005 | 14:29 | #0 |
---|
Привет всем!!!
Пробую прикрутить в Direct3D камеру. В OpenGL камера работает правильно. Но в Direct3D неправильно вращается.
вот код:
Пробую прикрутить в Direct3D камеру. В OpenGL камера работает правильно. Но в Direct3D неправильно вращается.
вот код:
class Camera { private: ... Matrix4x4 Matrix; //Матрица преобразования камеры Vector3D Up; //Вертикальное направление Vector3D Direction;//Направление направления взгляда Vector3D Right; //Направление движения по x Vector3D Position; //Текущая позиция камеры ... public: //установка вектора направления inline void SetDirection(const Vector3D& vec) { Direction = vec; } //установка позиции inline void SetPosition(const Vector3D& vec) { Direction = vec; } //установка вектора верха inline void SetUp(const Vector3D& vec) { Up = vec; } //установить вектор права inline void SetRight(const Vector3D& vec) { Right = vec; } //Возвращает матрицу преобразования float *GetMatrix() { return Matrix.Matrix; }; //Возвращает вектор позиции камеры inline const Vector3D& GetPosition() const { return Position; }; //Возвращает вектор верхнего направления камеры inline const Vector3D& GetUp() const { return Up; }; //Возвращает вектор направления движения камеры камеры inline const Vector3D& GetDirection() const { return Direction; }; //Возвращает вектор правого направления движения камеры inline const Vector3D& GetRight() const { return Right; }; //Вращение камеры void Rotate(const Vector2D &point); //Изменение позиции камеры void Move(const char* keys, float speed); .... }; //Вращение камеры void Camera::Rotate(const Vector2D &point) { Matrix4x4 Mat; Mat.LoadIdentity(); if (point.y != 0) { Mat.RotateMatrix(Right, point.y); Direction = Direction * Mat; Up = Up * Mat; } if (point.x != 0) { Vector3D a(0.0f,1.0f,0.0f); Mat.RotateMatrix(a, point.x); Direction = Direction * Mat; Up = Up * Mat; } } //Изменение позиции камеры void Camera::Move(const char* keys, float speed) { //Приращение координат float dz = Speed * speed; //Приращение координат float dx = Speed * speed; if (keys == (char *)DIK_LEFT || keys == (char *)VK_LEFT) { Position.x -= (Right.x * dx); // Position.y -= (Right.y * dx); Position.z -= (Right.z * dz); } //Если нажата клавиша впрао if (keys == (char *)DIK_RIGHT || keys == (char *)VK_RIGHT) { Position.x += (Right.x * dx); // Position.y += (Right.y * dx); Position.z += (Right.z * dz); } //Если нажата клавиша вниз if (keys == (char *)DIK_DOWN || keys == (char *)VK_DOWN) { Position.x -= (Direction.x * dx); // Position.y -= (Direction.y * dx); Position.z -= (Direction.z * dz); } //Если работает DirectInput и нажата клавиша вверх if (keys == (char *)DIK_UP || keys == (char *)VK_UP) { Position.x += (Direction.x * dx); // Position.y += (Direction.y * dx); Position.z += (Direction.z * dz); } } class Matrix4x4 { ... public: float Matrix[16]; ... //Вращение вокруг вектора v на угол angle inline void RotateMatrix(Vector3D& v, float angle) { if (!v.length()) return; float Cos = float(cos(degrad * angle )); float Sin = float(sin(degrad * angle)); float t = 1 - Cos; v.Normalize(); Matrix[0] = Cos + t * v.x; Matrix[1] = v.x * v.y * t + v.z * Sin; Matrix[2] = v.x * v.z * t - v.y * Sin; Matrix[4] = v.x * v.y * t - v.z * Sin; Matrix[5] = Cos + t * v.y * v.y; Matrix[6] = v.y * v.z * t + v.x * Sin; Matrix[8] = v.x * v.z * t + v.y * Sin; Matrix[9] = v.y * v.z * t - v.x * Sin; Matrix[10] = v.z * v.z + (1 - v.z * v.z) * Cos; Matrix[3] = Matrix[7] = Matrix[11] = 0.0f; Matrix[15] = 1.0f; } };
версии OpenGL | 5 мая 2005 | 13:07 | #18 |
---|
версии OpenGL | 5 мая 2005 | 13:03 | #16 |
---|
Sniper
>а LIB по-моему не нужен?
нужен..
>а LIB по-моему не нужен?
нужен..
версии OpenGL | 5 мая 2005 | 13:02 | #14 |
---|
hr0nix
www.google.ru -> glew и т.д. :)
www.google.ru -> glew и т.д. :)
версии OpenGL | 5 мая 2005 | 12:50 | #9 |
---|
hr0nix
>А OpenGL 2.0 чем примечателен?
>А OpenGL 2.0 чем примечателен?
новые расширения да еще вроде некоторые стандартизированы...
версии OpenGL | 5 мая 2005 | 12:43 | #4 |
---|
glGetString(GL_VERSION) получишь версию OpenGL
все версии OpenGL > 1.1 это просто добавления новых расширений.
версия Самая первая версия 1.0 если я не ошибаюсь не поддерживала некоторых функция например смешанные массивы(glInterleavedArrays)
для использования функциональночти OpenGL 1.4 на до юзать ее расширения.
для этого надо включить библиотеку расширений glext.h или glew.h и т.д.
все версии OpenGL > 1.1 это просто добавления новых расширений.
версия Самая первая версия 1.0 если я не ошибаюсь не поддерживала некоторых функция например смешанные массивы(glInterleavedArrays)
для использования функциональночти OpenGL 1.4 на до юзать ее расширения.
для этого надо включить библиотеку расширений glext.h или glew.h и т.д.
вот пример для glew:
#include <gl\glew.h>//расширения OpenGL #include <gl\wglew.h>//расширения OpenGL //Подключение расширений OpenGL #pragma comment(lib, "glew32.lib") ... //инициализация всех доступных расширений if (glewInit() != GLEW_OK) MessageBox(NULL, "Ошибка инициализации расширений", "Error", MB_OK); ...
dynamic_cast либо просто приведение типа | 4 мая 2005 | 10:17 | #3 |
---|
ArT
> А на сколько тормознее начнет работать программа, если включить RTTI?
будет тормозить. в real-time мне кажеться лучше не делать
>- А если при этом не использовать dynamic_cast?
тогда нужно заранее передавать правильный указатель который можно потом преобразовать простым преобразованием на языке C или лучше преобразовать через static_cast
>- А если использовать?
будет надежней т.к. можно проверить указатель... но медленно
>- А какие еще преимущества дает RTTI
информацию о классе во время выполнения программы...
> А на сколько тормознее начнет работать программа, если включить RTTI?
будет тормозить. в real-time мне кажеться лучше не делать
>- А если при этом не использовать dynamic_cast?
тогда нужно заранее передавать правильный указатель который можно потом преобразовать простым преобразованием на языке C или лучше преобразовать через static_cast
>- А если использовать?
будет надежней т.к. можно проверить указатель... но медленно
>- А какие еще преимущества дает RTTI
информацию о классе во время выполнения программы...
Unhandled exception at 0x100012f4 (engine.dll) in engine_gametest.exe: 0xC0000005: Access violation reading location 0xbaadf00d. =(( | 3 мая 2005 | 16:06 | #6 |
---|
Ghost3
да ты прав.. не заметил
значит это мусорный адрес либо что-то затерто...
да ты прав.. не заметил
значит это мусорный адрес либо что-то затерто...
Direct3D 9.0: DrawPrimitiveUP вызывает exception: 0xC0000094: Integer division by zero. | 3 мая 2005 | 15:47 | #2 |
---|
Ghost3
Спасибо большое заработало!!!
как все просто....
тема закрыта...
Спасибо большое заработало!!!
как все просто....
тема закрыта...