青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

創建游戲內核(6)【OO改良版】

 

本篇是創建游戲內核(5)【OO改良版】的續篇,關于該內核的細節說明請參閱創建游戲內核(6)


接口:

class CAMERA
{
public:
    CAMERA();

    D3DXMATRIX* get_matrix();

    
void init();
    
void update();

    
void move(float x_pos, float y_pos, float z_pos);
    
void move_rel(float x_add, float y_add, float z_add);

    
void rotate(float x_rot, float y_rot, float z_rot);
    
void rotate_rel(float x_add, float y_add, float z_add);

    
void point(float x_eye, float y_eye, float z_eye, 
               
float x_at, float y_at, float z_at);

    
void set_start_track();
    
void set_end_track();
    
void track(float time_ratio, float time_length);

    
float get_x_pos();
    
float get_y_pos();
    
float get_z_pos();
    
float get_x_rotation();
    
float get_y_rotation();
    
float get_z_rotation();

private:
    
float m_x_pos, m_y_pos, m_z_pos;                   // camera current position
    float m_x_rot, m_y_rot, m_z_rot;                   // camera current rotation

    
float m_start_x_pos, m_start_y_pos, m_start_z_pos; // start tracking position
    float m_start_x_rot, m_start_y_rot, m_start_z_rot; // start tracking rotation

    
float m_end_x_pos, m_end_y_pos, m_end_z_pos;       // end tracking position
    float m_end_x_rot, m_end_y_rot, m_end_z_rot;       // end tracking rotation

    D3DXMATRIX m_mat_world;          
// world transform matrix
    D3DXMATRIX m_mat_translation;    // translation matrix
    D3DXMATRIX m_mat_rotation;       // rotation matrix
};

typedef CAMERA* CAMERA_PTR;
 

實現:

//-------------------------------------------------------------------------
// Constructor, zero member data.
//-------------------------------------------------------------------------
CAMERA::CAMERA()
{
    memset(
this, 0, sizeof(*this));   
}

//-------------------------------------------------------------------------
// initialize camera.
//-------------------------------------------------------------------------
void CAMERA::init()
{    
    update();
}

//-------------------------------------------------------------------------
// move camera to new position.
//-------------------------------------------------------------------------
void CAMERA::move(float x_pos, float y_pos, float z_pos)
{
    m_x_pos = x_pos;  m_y_pos = y_pos;  m_z_pos = z_pos;

    D3DXMatrixTranslation(&m_mat_translation, -x_pos, -y_pos, -z_pos);
}

//-------------------------------------------------------------------------
// move camera to new positoin which relative to current position.
//-------------------------------------------------------------------------
void CAMERA::move_rel(float x_add, float y_add, float z_add)
{
    move(m_x_pos + x_add, m_y_pos + y_add, m_z_pos + z_add);
}

//-------------------------------------------------------------------------
// Build rotation matrix.
//-------------------------------------------------------------------------
void CAMERA::rotate(float x_rot, float y_rot, float z_rot)
{
    D3DXMATRIX _mat_x_rot, _mat_y_rot, _mat_z_rot;

    m_x_rot = x_rot;  m_y_rot = y_rot; m_z_rot = z_rot;

    D3DXMatrixRotationX(&_mat_x_rot, -x_rot);
    D3DXMatrixRotationX(&_mat_y_rot, -y_rot);
    D3DXMatrixRotationX(&_mat_z_rot, -z_rot);

    m_mat_rotation = _mat_z_rot;
    
    D3DXMatrixMultiply(&m_mat_rotation, &m_mat_rotation, &_mat_y_rot);
    D3DXMatrixMultiply(&m_mat_rotation, &m_mat_rotation, &_mat_x_rot);       
}

//-------------------------------------------------------------------------
// Build rotation matrix which relative to current rotation.
//-------------------------------------------------------------------------
void CAMERA::rotate_rel(float x_add, float y_add, float z_add)
{
    rotate(m_x_rot + x_add, m_y_rot + y_add, m_z_rot + z_add);
}

//-------------------------------------------------------------------------
// move camera to new position and look at new target position.
//-------------------------------------------------------------------------
void CAMERA::point(float x_eye, float y_eye, float z_eye, 
                   
float x_at, float y_at, float z_at)
{
    
// Calculate angles between points

    
float _x_diff = x_at - x_eye;
    
float _y_diff = y_at - y_eye;
    
float _z_diff = z_at - z_eye;

    
float _x_rot = (float) atan2(-_y_diff, sqrt(_x_diff * _x_diff + _z_diff * _z_diff));
    
float _y_rot = (float) atan2(_x_diff, _z_diff);

    
// move camera to new position and look at new target
    move(x_eye, y_eye, z_eye);
    rotate(_x_rot, _y_rot, 0.0);
}

//-------------------------------------------------------------------------
// set camera's start tracking position and rotation.
//-------------------------------------------------------------------------
void CAMERA::set_start_track()
{
    m_start_x_pos = m_x_pos;  m_start_x_pos = m_y_pos;  m_start_z_pos = m_z_pos;
    m_start_x_rot = m_x_rot;  m_start_y_rot = m_y_rot;  m_start_z_rot = m_z_rot;
}

//-------------------------------------------------------------------------
// set camera's end tracking position and rotation.
//-------------------------------------------------------------------------
void CAMERA::set_end_track()
{
    m_end_x_pos = m_x_pos;  m_end_y_pos = m_y_pos;  m_end_z_pos = m_z_pos;
    m_end_x_rot = m_x_rot;  m_end_y_rot = m_y_rot;  m_end_z_rot = m_z_rot;
}

//-------------------------------------------------------------------------
// move camera to new position and ratation by giving time, 
// 0 <= time_ratio <= 1.
//-------------------------------------------------------------------------
void CAMERA::track(float time_ratio, float time_length)
{
    
float time_offset = time_length * time_ratio;

    
float x = (m_end_x_pos - m_start_x_pos) / time_length * time_offset;
    
float y = (m_end_y_pos - m_start_x_pos) / time_length * time_offset;
    
float z = (m_end_z_pos - m_start_z_pos) / time_length * time_offset;

    move(m_start_x_pos + x, m_start_x_pos + y, m_start_z_pos + z);

    x = (m_end_x_rot - m_start_x_rot) / time_length * time_offset;
    y = (m_end_y_rot - m_start_y_rot) / time_length * time_offset;
    z = (m_end_z_rot - m_start_z_rot) / time_length * time_offset;

    rotate(m_start_x_rot + x, m_start_y_rot + y, m_start_z_rot + z);
}

//-------------------------------------------------------------------------
// update new camera world transform matrix.
//-------------------------------------------------------------------------
void CAMERA::update()
{
    D3DXMatrixMultiply(&m_mat_world, &m_mat_translation, &m_mat_rotation);
}

//-------------------------------------------------------------------------
// Get camera world transform matrix.
//-------------------------------------------------------------------------
D3DXMATRIX* CAMERA::get_matrix()
{
    update();

    
return &m_mat_world;
}

//-------------------------------------------------------------------------
// Get camera current position (x coordinate).
//-------------------------------------------------------------------------
float CAMERA::get_x_pos()
{
    
return m_x_pos;
}

//-------------------------------------------------------------------------
// Get camera current position (y coordinate).
//-------------------------------------------------------------------------
float CAMERA::get_y_pos()
{
    
return m_y_pos;
}

//-------------------------------------------------------------------------
// Get camera current position (z coordinate).
//-------------------------------------------------------------------------
float CAMERA::get_z_pos()
{
    
return m_z_pos;
}

//-------------------------------------------------------------------------
// Get camera current rotation (x coordinate).
//-------------------------------------------------------------------------
float CAMERA::get_x_rotation()
{
    
return m_x_rot;
}

//-------------------------------------------------------------------------
// Get camera current rotation (y coordinate).
//-------------------------------------------------------------------------
float CAMERA::get_y_rotation()
{
    
return m_y_rot;
}

//-------------------------------------------------------------------------
// Get camera current rotation (z coordinate).
//-------------------------------------------------------------------------
float CAMERA::get_z_rotation()
{
    
return m_z_rot;
}

posted on 2007-10-06 18:04 lovedday 閱讀(277) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩综合在线| 久久综合伊人77777麻豆| 中文国产成人精品| 欧美成人免费大片| 久久久久国色av免费看影院 | 最近看过的日韩成人| 国产一区视频网站| 激情文学一区| 1024成人网色www| 在线日韩日本国产亚洲| 亚洲国产裸拍裸体视频在线观看乱了| 一本色道**综合亚洲精品蜜桃冫 | 国产综合色一区二区三区| 国产精品久久久久久亚洲调教| 欧美日韩美女| 国产精品久久亚洲7777| 国产亚洲毛片在线| 亚洲国产欧美另类丝袜| 亚洲理论电影网| 亚洲在线中文字幕| 欧美精品三级日韩久久| 欧美激情视频在线播放| 国产精品久久久久久久第一福利| 中文在线资源观看网站视频免费不卡 | 亚洲美女av电影| 亚洲私人影吧| 久久成人免费电影| 亚洲国内在线| 亚洲一区二区三区三| 麻豆国产va免费精品高清在线| 欧美午夜精品一区二区三区| 国产亚洲视频在线| 亚洲伦理在线免费看| 亚洲欧美www| 亚洲国产高清在线| 性做久久久久久久免费看| 免费人成精品欧美精品| 久久午夜羞羞影院免费观看| 美女久久网站| 奶水喷射视频一区| 欧美精品www在线观看| 欧美一区二区在线免费播放| 午夜精品久久久久久久99热浪潮 | 在线日韩欧美视频| 国产欧美精品在线观看| 久久噜噜噜精品国产亚洲综合| 亚洲私人黄色宅男| 一区二区精品在线观看| 亚洲第一网站免费视频| 国产精品日韩一区二区| 国产精品视频内| 国产麻豆视频精品| 国产日韩欧美在线播放| 国产一区二区三区久久久| 国产欧美日韩激情| 欧美一级视频免费在线观看| 欧美激情按摩在线| 国产精品a级| 亚洲第一天堂av| 欧美成人性网| 免费一级欧美片在线播放| 久久精品国产精品亚洲综合| 久久国产乱子精品免费女| 欧美一级大片在线观看| 久久国产精品99精品国产| 久久国产一区二区| 久久―日本道色综合久久| 裸体女人亚洲精品一区| 亚洲日本中文| 亚洲色图制服丝袜| 欧美一乱一性一交一视频| 欧美大片一区二区| 一本色道久久综合亚洲精品按摩| 欧美日韩一区二区三区在线| 久久久国产精品一区二区三区| 久久久久亚洲综合| 欧美高清视频免费观看| 一道本一区二区| 欧美一区二区三区四区在线 | 国产精品爽爽爽| 国产在线一区二区三区四区| 亚洲高清视频一区| 亚洲欧美精品在线| 免费在线成人| 宅男精品视频| 久久婷婷亚洲| 国产精品乱子久久久久| 亚洲国产日韩在线| 久久视频在线视频| 亚洲专区国产精品| 欧美电影免费观看网站| 国产三级欧美三级| 亚洲一区二区免费视频| 欧美成人嫩草网站| 久久在线免费观看| 久久免费99精品久久久久久| 久久这里只有| 国产日韩欧美亚洲| 一本久久青青| 欧美成人高清视频| 欧美一区二区三区播放老司机| 欧美精品一区二区三区蜜桃| 亚洲第一福利社区| 久久狠狠久久综合桃花| 一区二区av在线| 欧美日韩精品免费看| 在线看成人片| 国产毛片一区二区| 亚洲性视频网址| 亚洲狼人综合| 欧美日韩免费| 日韩一级黄色av| 91久久综合| 免费在线亚洲欧美| 久久久久久亚洲精品杨幂换脸| 欧美激情综合| 欧美成人久久| 亚洲黄页一区| 亚洲国产一区二区视频| 欧美韩日精品| 亚洲精品视频一区| 欧美激情bt| 99ri日韩精品视频| 亚洲精品日韩在线| 欧美日韩p片| 亚洲视频大全| 欧美精品在线一区| 久久久久中文| 亚洲福利视频二区| 樱桃国产成人精品视频| 在线欧美电影| 日韩午夜av在线| 亚洲国产精品热久久| 欧美成人一区二区三区| 99视频一区二区| 欧美精品v日韩精品v国产精品 | 国产精品私拍pans大尺度在线| 亚洲精品日产精品乱码不卡| 亚洲大胆美女视频| 欧美亚男人的天堂| 欧美一区二粉嫩精品国产一线天| 亚洲欧美日韩国产中文在线| 国产欧美亚洲精品| 欧美成人一区二区三区在线观看 | 亚洲影视中文字幕| 欧美在线观看你懂的| 亚洲特级片在线| 国产亚洲欧美一级| 久久久久久久网站| 亚洲啪啪91| 欧美精品一区二区视频| 午夜精品亚洲| 久久成人亚洲| 亚洲激情国产精品| 亚洲视频一区在线观看| 黄色另类av| 亚洲精品久久久蜜桃| 国产欧美日韩| 亚洲精品在线观| 国产一区二区成人久久免费影院| 亚洲第一区中文99精品| 国产视频不卡| 亚洲视频999| 国语自产在线不卡| 亚洲一区尤物| 亚洲精品孕妇| 久久精品中文| 欧美激情欧美狂野欧美精品 | 久久久久国产一区二区三区四区| 久久gogo国模裸体人体| 免费观看在线综合| 麻豆久久婷婷| 国产欧美一级| 亚洲国产二区| 激情av一区| 久久av老司机精品网站导航| 中文在线资源观看视频网站免费不卡| 欧美视频亚洲视频| 国产欧美一区二区色老头 | 亚洲深夜福利网站| 亚洲狼人精品一区二区三区| 久久成人精品电影| 久久国产日本精品| 国产精品香蕉在线观看| 亚洲免费精品| 免费欧美高清视频| 久久精品视频网| 国产精品久久999| 99国产精品99久久久久久| 亚洲美女免费视频| 欧美电影电视剧在线观看| 老色鬼精品视频在线观看播放| 亚洲国产清纯| 欧美综合二区| 欧美专区在线观看一区| 国产视频在线一区二区| 国产精品99久久99久久久二8| 中文一区字幕| 国产精品国产三级国产普通话99 | 欧美午夜免费|