Вторник, 26 Ноября 2024, 10:20

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
DirectX 9.0 и камера, что не так?
alex_progerДата: Пятница, 14 Сентября 2012, 18:51 | Сообщение # 1
участник
Сейчас нет на сайте
Здравствуйте форумчане, давно я здесь не был book
Итак вопрос : Я сделал камеру (см. код ниже) и не могу понять почему она не работает (камера в пространстве 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 формат) и не вижу её если использую камеру, если камера отключена то я вижу её частично.


Сообщение отредактировал alex_proger - Пятница, 14 Сентября 2012, 18:53
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг