Здравствуйте форумчане, давно я здесь не был
Итак вопрос : Я сделал камеру (см. код ниже) и не могу понять почему она не работает (камера в пространстве 3D)
Вот исходный код класса :
BestByte_camera3d.h
Code
#ifndef CAMERA_3D
#define CAMERA_3D
#include "BestByte_input.h"
#include "BestByte_render.h"
class BestByte_camera3d
{
private:
//API классы
BestByte_input *input;
BestByte_render *render;
//Камера и её параметры
POINT g_ptLastMousePosit;
POINT g_ptCurrentMousePosit;
bool g_bMousing;
float g_fMoveSpeed;
float g_fElpasedTime;
double g_dCurTime;
double g_dLastTime;
D3DXVECTOR3 g_vEye;
D3DXVECTOR3 g_vLook;
D3DXVECTOR3 g_vUp;
D3DXVECTOR3 g_vRight;
public:
BestByte_camera3d(BestByte_input *inp, BestByte_render *rnd);
~BestByte_camera3d();
void DrawAndUpdate();
private:
void UpdateInput();
void UpdateViewMatrix();
};
#endif
BestByte_camera3d.cpp
Code
#include "BestByte_camera3d.h"
BestByte_camera3d::BestByte_camera3d(BestByte_input *inp, BestByte_render *rnd)
{
input = inp;
render = rnd;
g_bMousing = true;
g_fMoveSpeed = 0.25f;
g_vEye = D3DXVECTOR3(5.0f, 5.0f, -5.0f);
g_vLook = D3DXVECTOR3(-0.5f, -0.5f, 0.5f);
g_vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
g_vRight = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
}
BestByte_camera3d::~BestByte_camera3d(){}
void BestByte_camera3d::DrawAndUpdate()
{
//Обновляем обзор
UpdateInput();
UpdateViewMatrix();
}
void BestByte_camera3d::UpdateInput()
{
int mx, my;
input->GetMouseLocation(mx, my);
g_ptCurrentMousePosit.x = mx;
g_ptCurrentMousePosit.y = my;
D3DXMATRIX matRotation;
if( g_bMousing )
{
int nXDiff = (g_ptCurrentMousePosit.x - g_ptLastMousePosit.x);
int nYDiff = (g_ptCurrentMousePosit.y - g_ptLastMousePosit.y);
if( nYDiff != 0 )
{
D3DXMatrixRotationAxis( &matRotation, &g_vRight, D3DXToRadian((float)nYDiff / 3.0f));
D3DXVec3TransformCoord( &g_vLook, &g_vLook, &matRotation );
D3DXVec3TransformCoord( &g_vUp, &g_vUp, &matRotation );
}
if( nXDiff != 0 )
{
D3DXMatrixRotationAxis( &matRotation, &D3DXVECTOR3(0,1,0), D3DXToRadian((float)nXDiff / 3.0f) );
D3DXVec3TransformCoord( &g_vLook, &g_vLook, &matRotation );
D3DXVec3TransformCoord( &g_vUp, &g_vUp, &matRotation );
}
}
g_ptLastMousePosit.x = g_ptCurrentMousePosit.x;
g_ptLastMousePosit.y = g_ptCurrentMousePosit.y;
D3DXVECTOR3 tmpLook = g_vLook;
D3DXVECTOR3 tmpRight = g_vRight;
// Up Arrow Key - View moves forward
if( input->IsKeyPressed(DIK_W) || input->IsKeyPressed(DIK_UP) )
g_vEye -= tmpLook*-g_fMoveSpeed*g_fElpasedTime;
// Down Arrow Key - View moves backward
if( input->IsKeyPressed(DIK_S) || input->IsKeyPressed(DIK_DOWN) )
g_vEye += (tmpLook*-g_fMoveSpeed)*g_fElpasedTime;
// Left Arrow Key - View side-steps or strafes to the left
if( input->IsKeyPressed(DIK_A) || input->IsKeyPressed(DIK_LEFT) )
g_vEye -= (tmpRight*g_fMoveSpeed)*g_fElpasedTime;
// Right Arrow Key - View side-steps or strafes to the right
if( input->IsKeyPressed(DIK_D) || input->IsKeyPressed(DIK_RIGHT) )
g_vEye += (tmpRight*g_fMoveSpeed)*g_fElpasedTime;
//if( input->IsKeyPressed(DIK_SPACE) )
//Jump with physics
//g_vEye.y += g_fMoveSpeed*g_fElpasedTime;
}
void BestByte_camera3d::UpdateViewMatrix()
{
D3DXMATRIX view;
D3DXMatrixIdentity( &view );
D3DXVec3Normalize( &g_vLook, &g_vLook );
D3DXVec3Cross( &g_vRight, &g_vUp, &g_vLook );
D3DXVec3Normalize( &g_vRight, &g_vRight );
D3DXVec3Cross( &g_vUp, &g_vLook, &g_vRight );
D3DXVec3Normalize( &g_vUp, &g_vUp );
view._11 = g_vRight.x;
view._12 = g_vUp.x;
view._13 = g_vLook.x;
view._14 = 0.0f;
view._21 = g_vRight.y;
view._22 = g_vUp.y;
view._23 = g_vLook.y;
view._24 = 0.0f;
view._31 = g_vRight.z;
view._32 = g_vUp.z;
view._33 = g_vLook.z;
view._34 = 0.0f;
view._41 = -D3DXVec3Dot( &g_vEye, &g_vRight );
view._42 = -D3DXVec3Dot( &g_vEye, &g_vUp );
view._43 = -D3DXVec3Dot( &g_vEye, &g_vLook );
view._44 = 1.0f;
render->getDevice()->SetTransform( D3DTS_VIEW, &view );
}
Собственно код основан вот на этом сурце : Тыц
Вот как я использую этот класс :
Code
//1 шаг : создание переменной хранящей класс камеры
BestByte_camera3d *cam3d;
//2 шаг : добавление устройств в камеру (управление и отображение)
cam3d = new BestByte_camera3d(input, render);
//3 шаг : обновление вида
cam3d->DrawAndUpdate();
//4 шаг : удаление камеры
delete cam3d;
Помогите кто чем может. Если не сложно киньте статейку где описано создание камеры (без волокиды с прочими библиотеками)
Отблагодарю +
P.S. я отображаю модель (.X формат) и не вижу её если использую камеру, если камера отключена то я вижу её частично.