So, I was working with 3D cameras and worlds, and I realized...I don't really understand what the matrices represent.
There is a ViewMatrix, a perspective matrix, an upmatrix, and a world matrix.
I thought that the ViewMatrix created the clipped world matrix, the perspective matrix scewed and transformed the world matrix to create an illusion of depth and perspective, and then a world matrix that contained the coordinates for everything...but that still leaves the up matrix, and I have NO idea what that would be.
I understand the math for creating perspective from matrices, but I don't know what the up matrix would be the equivalent to. What is this? How can I use this properly?
So far, I have created a camera like so...:
Camera.h:
Code:
#include "camera.h"
static float aspect = 800.0f / 600.0f;
Camera::Camera(CameraType type)
{
_Type = type;
_Position = _Rotation = PointF(0.0f, 0.0f, 0.0f);
//D3DXVECTOR3 cameraPosition( 0.0f, 10.0f, 0.0f );
//D3DXVECTOR3 cameraTarget( 0.0f, 1.0f, 10.0f );
//D3DXVECTOR3 cameraUp( 0.0f, 1.0f, 0.0f );
//D3DXMatrixLookAtLH( &ViewMatrix, &cameraPosition, &cameraTarget, &cameraUp );
//GraphicDevice::GetService()->Device()->SetTransform( D3DTS_VIEW, &ViewMatrix );
////D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, PI/4, 1.0f, 1.0f, 5000.0f);
////GraphicDevice::GetService()->Device()->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
// // Set the projection matrix
//D3DXMatrixPerspectiveFovLH( &ProjectionMatrix, D3DX_PI / 2, aspect, 1.0f, 1000.0f );
//GraphicDevice::GetService()->Device()->SetTransform( D3DTS_PROJECTION, &ProjectionMatrix );
}
Camera::~Camera(void)
{
}
void Camera::Update(void)
{
//D3DXVECTOR3 cameraPosition(_Position.X(), _Position.Y(), _Position.Z());
//D3DXVECTOR3 cameraTarget(_Position.X()+cos(_Rotation.Z()), _Position.Y(), _Position.Z()+sin(_Rotation.X()));
//D3DXVECTOR3 cameraUp(0.0f, 1.0f, 0.0f);
// D3DXMatrixLookAtLH( &ViewMatrix, &cameraPosition, &cameraTarget, &cameraUp );
//
// D3DXMatrixPerspectiveFovLH( &ProjectionMatrix, D3DX_PI / 2, aspect, 1.0f, 5000.0f );
// HRESULT a = GraphicDevice::GetService()->Device()->SetTransform( D3DTS_PROJECTION, &ProjectionMatrix );
//int i = 0;
D3DXVECTOR3 Position(_Position.X(), _Position.Y(), _Position.Z()),
Target(_Position.X(), _Position.Y(), _Position.Z()),
UpVector(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&ViewMatrix, &Position, &Target, &UpVector);
D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, D3DX_PI / 2, aspect, 1.0f, 5000.0f);
GraphicDevice::GetService()->Device()->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
}
void Camera::Rotate(TransformType type, PointF rotation)
{
switch(type)
{
case TransformTypes::Absolute:
_Rotation = rotation;
break;
case TransformTypes::Relative:
_Rotation += rotation;
break;
}
}
void Camera::Move(TransformType type, PointF A)
{
switch(type)
{
case TransformTypes::Absolute:
_Position = A;
break;
case TransformTypes::Relative:
_Position.Z(_Position.Z() + cos(A.Z()) + sin(A.Z()));
_Position.X(_Position.Z() + cos(A.Z()) - sin(A.Z()));
break;
}
}
Camera.cpp
Code:
#include "camera.h"
static float aspect = 800.0f / 600.0f;
Camera::Camera(CameraType type)
{
_Type = type;
_Position = _Rotation = PointF(0.0f, 0.0f, 0.0f);
//D3DXVECTOR3 cameraPosition( 0.0f, 10.0f, 0.0f );
//D3DXVECTOR3 cameraTarget( 0.0f, 1.0f, 10.0f );
//D3DXVECTOR3 cameraUp( 0.0f, 1.0f, 0.0f );
//D3DXMatrixLookAtLH( &ViewMatrix, &cameraPosition, &cameraTarget, &cameraUp );
//GraphicDevice::GetService()->Device()->SetTransform( D3DTS_VIEW, &ViewMatrix );
////D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, PI/4, 1.0f, 1.0f, 5000.0f);
////GraphicDevice::GetService()->Device()->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
// // Set the projection matrix
//D3DXMatrixPerspectiveFovLH( &ProjectionMatrix, D3DX_PI / 2, aspect, 1.0f, 1000.0f );
//GraphicDevice::GetService()->Device()->SetTransform( D3DTS_PROJECTION, &ProjectionMatrix );
}
Camera::~Camera(void)
{
}
void Camera::Update(void)
{
D3DXVECTOR3 cameraPosition(_Position.X(), _Position.Y(), _Position.Z());
D3DXVECTOR3 cameraTarget(_Position.X()+cos(_Rotation.Z()), _Position.Y(), _Position.Z()+sin(_Rotation.X()));
D3DXVECTOR3 cameraUp(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH( &ViewMatrix, &cameraPosition, &cameraTarget, &cameraUp );
D3DXMatrixPerspectiveFovLH( &ProjectionMatrix, D3DX_PI / 2, aspect, 1.0f, 5000.0f );
HRESULT a = GraphicDevice::GetService()->Device()->SetTransform( D3DTS_PROJECTION, &ProjectionMatrix );
//int i = 0;
//D3DXVECTOR3 Position(_Position.X(), _Position.Y(), _Position.Z()),
// Target(_Position.X(), _Position.Y(), _Position.Z()),
// UpVector(0.0f, 1.0f, 0.0f);
//D3DXMatrixLookAtLH(&ViewMatrix, &Position, &Target, &UpVector);
//D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, D3DX_PI / 2, aspect, 1.0f, 5000.0f);
//GraphicDevice::GetService()->Device()->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
}
void Camera::Rotate(TransformType type, PointF rotation)
{
switch(type)
{
case TransformTypes::Absolute:
_Rotation = rotation;
break;
case TransformTypes::Relative:
_Rotation += rotation;
break;
}
}
void Camera::Move(TransformType type, PointF A)
{
switch(type)
{
case TransformTypes::Absolute:
_Position = A;
break;
case TransformTypes::Relative:
_Position.Z(_Position.Z() + cos(A.Z()) + sin(A.Z()));
_Position.X(_Position.Z() + cos(A.Z()) - sin(A.Z()));
break;
}
}
Then I try to move it like so:
Code:
if(KeyboardDevice::GetService()->Pressed(Keys::ArrowUp))
{
camera.Move(TransformTypes::Relative, PointF(0.0f, 0.0f, 0.1f));
}
else if(KeyboardDevice::GetService()->Pressed(Keys::ArrowDown))
{
camera.Move(TransformTypes::Relative, PointF(0.0f, 0.0f, -0.1f));
}
So....Why doesn't this alter the perspective matrix, so that it appears that I am moving?
Does anyone know?