GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (217 стр.)

Сообщения на форуме пользователя Andrey (217 стр.)

Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно?5 мая 200518: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 мая 200518:01#8
jm
спасибо я попробовал но опять не работает...:(
чехарда со знаками из-за тоо что в OpenGL и Direct3D разные координатные системы...
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно?5 мая 200515: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 мая 200515:09#5
crazy25
да ты не ошибаешься цитирую 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 мая 200514:46#3
crazy25
>У тебя заполнение матрицы происходит в обоих случаях одинаково, а у OpenGL порядок строк и столбцов матрицы не такой >как у DirectX.
т.е. берем и транспонируем?
Камера в Direct3D и OpenGL: почему в Direct3D работает неправильно?5 мая 200514: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 мая 200514:29#0
Привет всем!!!
Пробую прикрутить в 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;
	}
};
версии OpenGL5 мая 200513:03#16
Sniper
>а LIB по-моему не нужен?
нужен..
версии OpenGL5 мая 200513:02#14
hr0nix
www.google.ru -> glew и т.д. :)
версии OpenGL5 мая 200512:50#9
hr0nix
>А OpenGL 2.0 чем примечателен?

новые расширения да еще вроде некоторые стандартизированы...

версии OpenGL5 мая 200512:43#4
glGetString(GL_VERSION)  получишь версию OpenGL
все версии 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 мая 200510:17#3
ArT
> А на сколько тормознее начнет работать программа, если включить 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 мая 200516:06#6
Ghost3
да ты прав.. не заметил
значит это мусорный адрес либо что-то затерто...
Direct3D 9.0: DrawPrimitiveUP вызывает exception: 0xC0000094: Integer division by zero.3 мая 200515:47#2
Ghost3
Спасибо большое заработало!!!
как все просто....
тема закрыта...

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр