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

天行健 君子當自強而不息

創建游戲內核(6)


本篇是 創建游戲內核(5)的續篇,其中涉及到矩陣以及坐標系統變換的知識請參閱DirectX 9的一些數學計算函數:矩陣,坐標變換。以及DirectX 9的坐標系統變換。

視口變換和CAMERA

CAMERA類和 WORLD_POSITION類非常類似,但CAMERA類處理的是視口變換矩陣。

來看看CAMERA類的定義:
 
//================================================================================
// Defines for class CAMERA.
//================================================================================
class CAMERA
{
protected:
    
float _x_pos, _y_pos, _z_pos;                   // camera current position
    float _x_rot, _y_rot, _z_rot;                   // camera current rotation

    
float _start_x_pos, _start_y_pos, _start_z_pos; // start tracking position
    float _start_x_rot, _start_y_rot, _start_z_rot; // start tracking rotation

    
float _end_x_pos, _end_y_pos, _end_z_pos;       // end tracking position
    float _end_x_rot, _end_y_rot, _end_z_rot;       // end tracking rotation

    D3DXMATRIX _mat_world;          
// world transform matrix
    D3DXMATRIX _mat_translation;    // translation matrix
    D3DXMATRIX _mat_rotation;       // rotation matrix

public:
    CAMERA();

    D3DXMATRIX* Get_Matrix();
    
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();
};

接著是CAMERA類的實現:
 
//-------------------------------------------------------------------
// Constructor, initialize camera's current position and rotation.
//-------------------------------------------------------------------
CAMERA::CAMERA()
{
    Move(0.0, 0.0, 0.0);
    Rotate(0.0, 0.0, 0.0);
    Update();
}

//-------------------------------------------------------------------
// Move camera to new position.
//-------------------------------------------------------------------
void CAMERA::Move(float x_pos, float y_pos, float z_pos)
{
    _x_pos = x_pos;  _y_pos = y_pos;  _z_pos = z_pos;

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

//-------------------------------------------------------------------
// Move camera to new positoin which is summed by current position and 
// added position.
//-------------------------------------------------------------------
void CAMERA::Move_Rel(float x_add, float y_add, float z_add)
{
    Move(_x_pos + x_add, _y_pos + y_add, _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;

    _x_rot = x_rot;  _y_rot = y_rot; _z_rot = z_rot;

    D3DXMatrixRotationX(&mat_x_rot, -x_rot);
    D3DXMatrixRotationX(&mat_y_rot, -y_rot);
    D3DXMatrixRotationX(&mat_z_rot, -z_rot);

    _mat_rotation = mat_z_rot;
    
    D3DXMatrixMultiply(&_mat_rotation, &_mat_rotation, &mat_y_rot);
    D3DXMatrixMultiply(&_mat_rotation, &_mat_rotation, &mat_x_rot);       
}

//-------------------------------------------------------------------
// Build rotation matrix which is summed by current rotation value 
// and added rotation value.
//-------------------------------------------------------------------
void CAMERA::Rotate_Rel(float x_add, float y_add, float z_add)
{
    Rotate(_x_rot + x_add, _y_rot + y_add, _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()
{
    _start_x_pos = _x_pos;  _start_y_pos = _y_pos;  _start_z_pos = _z_pos;
    _start_x_rot = _x_rot;  _start_y_rot = _y_rot;  _start_z_rot = _z_rot;
}

//-------------------------------------------------------------------
// Set camera's end tracking position and rotation.
//-------------------------------------------------------------------
void CAMERA::Set_End_Track()
{
    _end_x_pos = _x_pos;  _end_y_pos = _y_pos;  _end_z_pos = _z_pos;
    _end_x_rot = _x_rot;  _end_y_rot = _y_rot;  _end_z_rot = _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 = (_end_x_pos - _start_x_pos) / time_length * time_offset;
    
float y = (_end_y_pos - _start_y_pos) / time_length * time_offset;
    
float z = (_end_z_pos - _start_z_pos) / time_length * time_offset;

    Move(_start_x_pos + x, _start_y_pos + y, _start_z_pos + z);

    x = (_end_x_rot - _start_x_rot) / time_length * time_offset;
    y = (_end_y_rot - _start_y_rot) / time_length * time_offset;
    z = (_end_z_rot - _start_z_rot) / time_length * time_offset;

    Rotate(_start_x_rot + x, _start_y_rot + y, _start_z_rot + z);
}

//-------------------------------------------------------------------
// Update new camera world transform matrix.
//-------------------------------------------------------------------
void CAMERA::Update()
{
    D3DXMatrixMultiply(&_mat_world, &_mat_translation, &_mat_rotation);
}

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

    
return &_mat_world;
}

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

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

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

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

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

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

CAMERA類和WORLD_POSITION類惟一的不同就是加上了Point、Set_Start_Track、 Set_End_Track以及Track函數。Point函數用來確定觀察點的方位并在瞬間將它指向一個特定的方向。

三個同追蹤有關的函數隨著時間追蹤攝像機的移動路徑。要使用攝像機追蹤方位,將攝像機放到預想的起始位置并調用CAMERA:: Set_Start_Track,然后再將攝像機移動到預想的結束方位并調用CAMERA::Set_End_Track即可。

接下來需要調用CAMERA::Track函數(要在調用CAMERA::Update之前調用它)沿著創建的軌跡來定位攝像機。 Track函數的time_ratio參數的范圍從0.0(起始方位)-1.0(結束方位),任何介于此范圍內的值都會將攝像機沿著軌跡進行移動, time_length可以是任意起作用的值(舉例來說,毫秒)。

攝像機追蹤創建了一些很棒的效果,下面的示例說明了這一點:
 
    CAMERA camera;

    
// 移到位置(0.0, 100.0, -100.0)處并朝向原點
    camera.Point(0.0, 100.0, -100.0, 0.0, 0.0, 0.0);
    camera.Set_Start_Track();

    
// 移到結束方位
    camera.Point(-100.0, 0.0, 0.0, 0.0, 100.0, 0.0);
    camera.Set_End_Track();

    
// 每過10000毫秒將攝像機放置到起始方位和結束方位的一半處
    camera.Track(0.5, 10000);
    camera.Update();

posted on 2007-08-29 18:14 lovedday 閱讀(349) 評論(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>
            亚洲欧美激情视频在线观看一区二区三区 | 欧美激情亚洲综合一区| 在线一区欧美| 欧美日韩精品久久久| 久久中文字幕导航| 国产精品日本欧美一区二区三区| 欧美激情精品久久久| 亚洲国产精品尤物yw在线观看| 久久久久国色av免费看影院| 久久人人97超碰精品888 | 亚洲精品中文字幕有码专区| 亚洲午夜在线视频| 亚洲电影下载| 久久午夜国产精品| 在线欧美不卡| 欧美一区二区三区四区在线观看 | 国产无遮挡一区二区三区毛片日本| 一区二区三区免费网站| 亚洲天堂视频在线观看| 国产伦精品一区| 亚洲欧美日韩国产综合| 亚洲欧美综合国产精品一区| 合欧美一区二区三区| 在线不卡中文字幕| 亚洲精品一区二区三区樱花| 国产精品二区三区四区| 久久久久国产一区二区三区| 欧美国产一区二区在线观看| 国产三级精品三级| 欧美大片在线看| 欧美性大战久久久久| 久久综合99re88久久爱| 免费观看亚洲视频大全| 一区在线观看| 99亚洲视频| 久久久精品一品道一区| 国产精品日本| 在线亚洲免费| 一区二区三区波多野结衣在线观看| 国产欧美一区二区三区国产幕精品| 欧美成人免费va影院高清| 欧美午夜一区二区福利视频| 老司机午夜精品视频在线观看| 欧美日本不卡高清| 久久人人精品| 国产精品久久久久久久午夜片| 欧美电影电视剧在线观看| 午夜日韩在线| 欧美大片免费| 可以看av的网站久久看| 欧美电影打屁股sp| 亚洲精品视频在线观看网站| 日韩亚洲欧美一区二区三区| 亚洲成人影音| 性欧美长视频| 一本色道久久综合| 久久亚洲欧美| 午夜视频在线观看一区| 欧美日韩成人在线| 亚洲第一精品影视| 亚洲电影免费观看高清完整版| 欧美在线视频导航| 久久久久久久久一区二区| 国产毛片精品视频| 亚洲免费久久| 欧美韩日一区二区三区| 欧美激情一二区| 亚洲欧美日韩天堂一区二区| 一区二区三区精品在线| 欧美第一黄色网| 91久久视频| 一本色道久久99精品综合| 欧美日本不卡高清| 夜夜爽夜夜爽精品视频| 99re热这里只有精品免费视频| 欧美电影免费观看| 久久精品夜色噜噜亚洲a∨| 欧美日韩高清在线| 老司机67194精品线观看| 欧美色区777第一页| 亚洲精品中文在线| 亚洲深夜激情| 国产欧美一区二区精品仙草咪 | 欧美一区视频| 久久综合狠狠综合久久综青草| 国产综合色在线视频区| 久久久亚洲高清| 欧美高清在线视频| 国产在线乱码一区二区三区| 久久精品欧美日韩| 久热精品视频| 亚洲深夜福利在线| 欧美电影资源| 中文av字幕一区| 正在播放亚洲一区| 国产精品久久综合| 久久精品卡一| 亚洲乱亚洲高清| 欧美在线视频免费观看| 久久精品中文字幕一区| 国产精品一区二区三区久久 | 国产精品综合av一区二区国产馆| 午夜精品久久久久久| 欧美高清你懂得| 亚洲免费在线电影| 国内精品久久久久久久影视麻豆 | 国产精品九九| 欧美一区二区三区视频| 亚洲第一页中文字幕| 亚洲一区二区在线看| 久久成人精品无人区| 亚洲国产va精品久久久不卡综合| 亚洲视频高清| 精品999在线观看| 欧美天天影院| 久久久久久噜噜噜久久久精品 | 美女诱惑黄网站一区| 在线午夜精品| 免费欧美在线视频| 亚洲一区二区精品在线观看| 国产精品视频xxx| 欧美一区免费视频| 免费视频久久| 亚洲精品日产精品乱码不卡| 国产精品亚洲аv天堂网| 久久综合免费视频影院| 亚洲男女毛片无遮挡| 最新国产成人在线观看| 久久久欧美精品| 亚洲激情视频在线| 韩国在线一区| 国产精品乱码| 欧美午夜精品久久久久久人妖| 久久精品一区二区三区中文字幕 | 欧美激情在线播放| 亚洲永久免费视频| 久久精品欧美日韩精品| 亚洲国产精品精华液2区45| 国产婷婷成人久久av免费高清 | 欧美顶级大胆免费视频| 久久在线免费观看| 校园春色综合网| 亚洲伊人第一页| 亚洲麻豆视频| 久久蜜臀精品av| 午夜一级在线看亚洲| 亚洲一级在线观看| 亚洲激情啪啪| 在线欧美日韩精品| 国语自产精品视频在线看一大j8| 亚洲精品视频在线| 最新亚洲电影| 亚洲精品一区二区三区99| 欧美福利专区| 欧美成人免费网| 欧美激情中文字幕一区二区| 亚洲字幕在线观看| 亚洲欧洲一区二区三区久久| 有码中文亚洲精品| 极品av少妇一区二区| 国语精品中文字幕| 伊人久久婷婷色综合98网| 精品成人国产| 红桃视频国产精品| 一区在线免费| 欧美日韩国产二区| 在线一区视频| 久久精品男女| 快she精品国产999| 欧美激情国产精品| 欧美日韩高清在线观看| 欧美日韩一区视频| 国产精品扒开腿做爽爽爽软件| 欧美色图首页| 国产精品女主播在线观看 | 欧美一区二区三区日韩| 欧美亚洲一区二区在线| 久久久久久久久伊人| 欧美xxxx在线观看| 亚洲高清视频在线观看| 久久精品国产第一区二区三区| 正在播放亚洲一区| 宅男精品视频| 亚洲欧美日韩成人高清在线一区| 欧美一区午夜精品| 欧美a级片网站| 亚洲日产国产精品| 亚洲一区二区不卡免费| 久久精品一二三区| 欧美韩日亚洲| 国产欧美日韩精品一区| 狠狠色香婷婷久久亚洲精品| 亚洲国产精品久久久久久女王| 在线观看欧美日本| 亚洲福利小视频| 99国产精品久久久久久久| 久久gogo国模裸体人体| 欧美高清成人| 亚洲欧美激情精品一区二区| 麻豆久久婷婷|