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

天行健 君子當(dāng)自強(qiáng)而不息

創(chuàng)建游戲內(nèi)核(5)


本篇是 創(chuàng)建游戲內(nèi)核(4)的續(xù)篇,其中涉及到矩陣以及坐標(biāo)系統(tǒng)變換的知識請參閱DirectX 9的一些數(shù)學(xué)計(jì)算函數(shù):矩陣,坐標(biāo)變換。以及DirectX 9的坐標(biāo)系統(tǒng)變換。

圖形內(nèi)核

圖形內(nèi)核是游戲內(nèi)核最主要的部分,也是最大和最復(fù)雜的內(nèi)核對象,下表列出了圖形內(nèi)核中的類:

 

圖形內(nèi)核組件

說明
GRAPHICS 處理Direct3D的初始化,啟用狀態(tài)渲染以及設(shè)置紋理,材質(zhì)和光照。
TEXTURE 含有一個(gè)紋理以及一個(gè)用于將紋理的2D部分繪制到顯示器上的函數(shù)。
MATERIAL 含有一個(gè)材質(zhì)的定義
LIGHT 含有一個(gè)光照的定義
FONT 封裝了ID3DXFont對象
VERTEX_BUFFER 使對頂點(diǎn)緩沖的處理變得更容易
WORLD_POSITION 操縱世界變換矩陣,使程序員能夠快速定位、縮放和旋轉(zhuǎn)對象。
CAMERA 包含一個(gè)觀察變換矩陣,可以使用該對象的接口修改此矩陣。
MESH 包含從一個(gè) .X 文件加載的網(wǎng)格的列表以及這些網(wǎng)格的材質(zhì),MESH類要同OBJECT類結(jié)合起來使用。
OBJECT 表示3D世界中的一個(gè)對象,OBJECT類控制了對象的方位、網(wǎng)格以及動態(tài)狀態(tài)。
ANIMATION 包含從一個(gè) .X 文件加載的動畫列表,ANIMATION 類要同OBJECT類結(jié)合起來使用。

其中GRAPHICS對象是所有圖形內(nèi)核對象的基礎(chǔ)。

世界變換和WORLD_POSITION

雖然處理世界變換矩陣并不難,但是用一個(gè)類來處理諸如世界坐標(biāo)、旋轉(zhuǎn)值以及縮放因子等所有細(xì)節(jié),就更簡單明了。另外,這個(gè)類中還加入了公告板技術(shù)。

來看看WOLRD_POSITION的定義:

 
/*************************************************************************
PURPOSE:
    Defines graphics component for game core.
*************************************************************************/


#ifndef _CORE_GRAPHICS_H_
#define _CORE_GRAPHICS_H_

#define Release_COM(x)  if(x) { x->Release(); x = NULL; }

class GRAPHICS;

//================================================================================
// Defines for class GRAPHICS.
//================================================================================
class GRAPHICS
{
protected:
    HWND                _hwnd;          
// window handle pointer to parent window
    IDirect3D9*         _d3d;           // pointer to Direct3D
    IDirect3DDevice9*   _d3d_device;    // pointer to Direct3D device

public:

    IDirect3D9* Get_Direct3D_COM();
    IDirect3DDevice9* Get_Device_COM();
};

//================================================================================
// Defines for class WORLD_POSITION.
//================================================================================
class WORLD_POSITION
{
protected:
    BOOL    _use_billboard;     
// flag indicates whether use billboard

    
float _x_pos, _y_pos, _z_pos;                   // current position
    float _x_rotation, _y_rotation, _z_rotation;    // rotation
    float _x_scale, _y_scale, _z_scale;             // scale value

    D3DXMATRIX  _mat_world;         
// world transform matrix
    D3DXMATRIX  _mat_scale;         // scale matrix
    D3DXMATRIX  _mat_rotation;      // rotation matrix
    D3DXMATRIX  _mat_translation;   // translation matrix
    D3DXMATRIX* _mat_combine_1;     // pointer to combination matrix 1
    D3DXMATRIX* _mat_combine_2;     // pointer to combination matrix 2

public:
    WORLD_POSITION();

    D3DXMATRIX* Get_Matrix(GRAPHICS* graphics = NULL);
    
void Set_Combine_Matrix_1(D3DXMATRIX* matrix = NULL);
    
void Set_Combine_Matrix_2(D3DXMATRIX* matrix = NULL);

    
void Copy(WORLD_POSITION* dest_pos);

    
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 Scale(float x_scale, float y_scale, float z_scale);
    
void Scale_Rel(float x_add, float y_add, float z_add);

    
void Update(GRAPHICS* graphics = NULL);
    
void Enable_Billboard(BOOL use_billboard = TRUE);

    
float Get_X_Pos();
    
float Get_Y_Pos();
    
float Get_Z_Pos();
    
float Get_X_Rotation();
    
float Get_Y_Rotation();
    
float Get_Z_Rotation();
    
float Get_X_Scale();
    
float Get_Y_Scale();
    
float Get_Z_Scale();
};

#endif
 

下面是WORLD_POSITION的實(shí)現(xiàn):

 
/*************************************************************************
PURPOSE:
    Defines graphics component for game core.
*************************************************************************/


#include "Core_Global.h"
#include "rmxftmpl.h"
#include "rmxfguid.h"

///////////////////////////////////// Define for class GRAPHICS /////////////////////////////////////

//-------------------------------------------------------------------
// Get pointer to Direct3D.
//-------------------------------------------------------------------
IDirect3D9* GRAPHICS::Get_Direct3D_COM()
{
    
return _d3d;
}

//-------------------------------------------------------------------
// Get pointer to Direct3D device.
//-------------------------------------------------------------------
IDirect3DDevice9* GRAPHICS::Get_Device_COM()
{
    
return _d3d_device;
}

///////////////////////////////////// Define for class WORLD_POSITION /////////////////////////////////////

//-------------------------------------------------------------------
// Constrcutor, initialize data member.
//-------------------------------------------------------------------
WORLD_POSITION::WORLD_POSITION()
{
    _use_billboard = TRUE;
    _mat_combine_1 = _mat_combine_2 = NULL;

    Move(0.0, 0.0, 0.0);
    Rotate(0.0, 0.0, 0.0);
    Scale(1.0, 1.0, 1.0);

    Update();
}

//-------------------------------------------------------------------
// Copy world position information to another world position object.
//-------------------------------------------------------------------
void WORLD_POSITION::Copy(WORLD_POSITION* dest_pos)
{
    dest_pos->Move(_x_pos, _y_pos, _z_pos);
    dest_pos->Rotate(_x_rotation, _y_rotation, _z_rotation);
    dest_pos->Scale(_x_scale, _y_scale, _z_scale);
    dest_pos->Enable_Billboard(_use_billboard);
}

//-------------------------------------------------------------------
// Move to new world position with specified relative value.
//-------------------------------------------------------------------
void WORLD_POSITION::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 to new world position which is specified by new relative value
// and current position.
//-------------------------------------------------------------------
void WORLD_POSITION::Move_Rel(float x_add, float y_add, float z_add)
{
    Move(_x_pos + x_add, _y_pos + y_add, _z_pos + z_add);
}

//-------------------------------------------------------------------
// Rotate around x, y, z, axis with specified degree.
//-------------------------------------------------------------------
void WORLD_POSITION::Rotate(float x_rot, float y_rot, float z_rot)
{
    _x_rotation = x_rot;
    _y_rotation = y_rot;
    _z_rotation = z_rot;

    
// Builds a matrix with a specified yaw, pitch, and roll.
    D3DXMatrixRotationYawPitchRoll(&_mat_rotation, _y_rotation, _x_rotation, _z_rotation);
}

//-------------------------------------------------------------------
// Rotate around x, y, z, axis which is specified with new relative 
// degree and current rotation value.
//-------------------------------------------------------------------
void WORLD_POSITION::Rotate_Rel(float x_add, float y_add, float z_add)
{
    Rotate(_x_rotation + x_add, _y_rotation + y_add, _z_rotation + z_add);
}

//-------------------------------------------------------------------
// Build scaling matrix.
//-------------------------------------------------------------------
void WORLD_POSITION::Scale(float x_scale, float y_scale, float z_scale)
{
    _x_scale = x_scale;
    _y_scale = y_scale;
    _z_scale = z_scale;

    D3DXMatrixScaling(&_mat_scale, x_scale, y_scale, z_scale);
}

//-------------------------------------------------------------------
// Build scaling matrix with specified value and current scaling value.
//-------------------------------------------------------------------
void WORLD_POSITION::Scale_Rel(float x_add, float y_add, float z_add)
{
    Scale(_x_scale + x_add, _y_scale + y_add, _z_scale + z_add);
}

//-------------------------------------------------------------------
// Update world tranform matrix.
//-------------------------------------------------------------------
void WORLD_POSITION::Update(GRAPHICS* graphics)
{
    D3DXMATRIX mat_view, mat_transposed;

    
// setup billboarding matrix
    if(_use_billboard)
    {
        
if(graphics && graphics->Get_Device_COM())
        {
            graphics->Get_Device_COM()->GetTransform(D3DTS_VIEW, &mat_view);
            D3DXMatrixTranspose(&mat_transposed, &mat_view);

            mat_transposed._41 = mat_transposed._42 = mat_transposed._43 = 0.0;
            mat_transposed._14 = mat_transposed._24 = mat_transposed._34 = 0.0;
        }
        
else
            D3DXMatrixIdentity(&mat_transposed);
    }

    
// combine scaling and rotation matrices first
    D3DXMatrixMultiply(&_mat_world, &_mat_scale, &_mat_rotation);

    
// apply billboard matrix
    if(_use_billboard)
        D3DXMatrixMultiply(&_mat_world, &_mat_world, &mat_transposed);

    
// combine with translation matrix
    D3DXMatrixMultiply(&_mat_world, &_mat_world, &mat_transposed);

    
// combine with combined matrices (if any)

    
if(_mat_combine_1 != NULL)
        D3DXMatrixMultiply(&_mat_world, &_mat_world, _mat_combine_1);

    
if(_mat_combine_2 != NULL)
        D3DXMatrixMultiply(&_mat_world, &_mat_world, _mat_combine_2);
}

//-------------------------------------------------------------------
// Enable or disable billboard.
//-------------------------------------------------------------------
void WORLD_POSITION::Enable_Billboard(BOOL use_billboard)
{
    _use_billboard = use_billboard;
}

//-------------------------------------------------------------------
// Get current world transform matrix.
//-------------------------------------------------------------------
D3DXMATRIX* WORLD_POSITION::Get_Matrix(GRAPHICS *graphics)
{
    Update(graphics);

    
return &_mat_world;
}

//-------------------------------------------------------------------
// Set combination matrix 1 which will be combined with world matrix.
//-------------------------------------------------------------------
void WORLD_POSITION::Set_Combine_Matrix_1(D3DXMATRIX* matrix)
{
    _mat_combine_1 = matrix;
}

//-------------------------------------------------------------------
// Set combination matrix 2 which will be combined with world matrix.
//-------------------------------------------------------------------
void WORLD_POSITION::Set_Combine_Matrix_2(D3DXMATRIX* matrix)
{
    _mat_combine_2 = matrix;
}

//-------------------------------------------------------------------
// Get current position's x coordinate.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_X_Pos()
{
    
return _x_pos;
}

//-------------------------------------------------------------------
// Get current position's y coordinate.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_Y_Pos()
{
    
return _y_pos;
}

//-------------------------------------------------------------------
// Get current position's z coordinate.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_Z_Pos()
{
    
return _z_pos;
}

//-------------------------------------------------------------------
// Get current rotation value which rotate around x axis.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_X_Rotation()
{
    
return _x_rotation;
}

//-------------------------------------------------------------------
// Get current rotation value which rotate around y axis.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_Y_Rotation()
{
    
return _y_rotation;
}

//-------------------------------------------------------------------
// Get current rotation value which rotate around z axis.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_Z_Rotation()
{
    
return _z_rotation;
}

//-------------------------------------------------------------------
// Get current scale value which around x axis.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_X_Scale()
{
    
return _x_scale;
}

//-------------------------------------------------------------------
// Get current scale value which around y axis.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_Y_Scale()
{
    
return _y_scale;
}

//-------------------------------------------------------------------
// Get current scale value which around z axis.
//-------------------------------------------------------------------
float WORLD_POSITION::Get_Z_Scale()
{
    
return _z_scale;
}

Update函數(shù)使用內(nèi)含的方位重新創(chuàng)建世界變換矩陣,要考慮的矩陣有公告板矩陣以及兩個(gè)外部矩陣(稱之為組合矩陣, combined matrices)。要設(shè)置兩個(gè)組合矩陣的來源,使用Set_Combine_Matrix_1和Set_Combine_Matrix_2函數(shù)即可。

Get_Matrix函數(shù)返回當(dāng)前的世界變換矩陣,要確保傳遞給Get_Matrix函數(shù)的是當(dāng)前正在用來計(jì)算公告板矩陣(由觀察矩陣的轉(zhuǎn)置矩陣計(jì)算得出)的GRAPHICS對象。

下面的代碼演示了將3D世界中的兩個(gè)對象進(jìn)行定向的過程(一個(gè)對象附加到另一個(gè)對象之上):

 
    WORLD_POSITION object_pos, object_pos2;

    object_pos.Move(10.0, 100.0, -56.0);
    object_pos.Rotate(1.571, 0.0, 0.785);
    object_pos.Update();    
// 計(jì)算更新的矩陣

     // 將第2個(gè)對象同第1個(gè)對象進(jìn)行合并
    object_pos2.Set_Combine_Matrix_1(object_pos.Get_Matrix());
    object_pos2.Rotate(0.0, 0.0, 3.14);
    object_pos2.Update();   
// 使用合并后的矩陣計(jì)算更新的矩陣

posted on 2007-08-29 00:57 lovedday 閱讀(455) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品乱码久久久久久| 久久av资源网| 美女精品视频一区| 六月婷婷一区| 亚洲国产91| 日韩视频精品在线观看| 99精品国产在热久久| 亚洲欧美精品在线观看| 久久青青草综合| 欧美一区二区三区免费视频| 国产一区二区三区黄视频| 国产一区二区在线观看免费| 在线高清一区| 99视频有精品| 久久久久国产精品厨房| 亚洲青色在线| 欧美亚洲日本国产| 欧美国产精品v| 国产精品午夜在线| 亚洲人在线视频| 欧美综合77777色婷婷| 亚洲国产日韩欧美在线99 | 午夜精品一区二区三区在线| 久色婷婷小香蕉久久| 在线综合亚洲| 美日韩丰满少妇在线观看| 国产精品视频一二| 99热免费精品| 欧美激情视频网站| 久久爱www久久做| 欧美性猛片xxxx免费看久爱| 亚洲片在线观看| 老鸭窝91久久精品色噜噜导演| 亚洲一区二区欧美日韩| 欧美久久久久久久| 亚洲国产精品精华液2区45| 久久精品中文字幕免费mv| 亚洲一区二区三区四区中文 | 欧美一区二区三区喷汁尤物| 亚洲精品视频免费观看| 免费视频最近日韩| 激情一区二区三区| 久久久99爱| 欧美一级成年大片在线观看| 国产精品久99| 亚洲一区三区在线观看| aa级大片欧美三级| 欧美国产日韩在线| 91久久久久久久久| 欧美成人国产va精品日本一级| 欧美在线高清视频| 国产午夜精品视频免费不卡69堂| 亚洲欧美日韩中文视频| 亚洲四色影视在线观看| 国产精品久久久久久久久免费| 亚洲一区精品视频| 亚洲一区二区免费在线| 国产精品一区二区在线观看| 亚洲免费网址| 亚洲在线播放| 经典三级久久| 欧美成人综合在线| 牛人盗摄一区二区三区视频| 免费在线观看日韩欧美| 日韩视频永久免费| 久久福利资源站| 欧美中文字幕在线| 亚洲第一黄色| 亚洲精品资源美女情侣酒店| 欧美日在线观看| 亚洲欧美在线视频观看| 性欧美精品高清| 在线观看日韩av| 亚洲国产成人在线| 国产精品videosex极品| 欧美一区二区三区另类| 久久久综合网站| 9久草视频在线视频精品| 亚洲婷婷综合色高清在线| 国产在线观看91精品一区| 欧美激情中文字幕一区二区| 欧美日韩色婷婷| 欧美在线免费一级片| 久久人人爽人人爽| 亚洲视频免费| 久久国产精品久久国产精品| 亚洲三级视频| 亚洲欧美在线网| 亚洲精品视频在线观看网站| 亚洲一区亚洲| 亚洲国产精品www| 亚洲一区二区毛片| 亚洲精品免费在线观看| 午夜精品国产更新| 亚洲黄色影院| 亚洲欧美日韩一区二区| 日韩一级精品| 久久精品国产亚洲高清剧情介绍| 亚洲精品国产日韩| 亚洲欧美综合精品久久成人| 亚洲精品在线一区二区| 亚洲欧美在线观看| 亚洲视频一二| 欧美成人一二三| 久久免费视频观看| 国产精品一二三四区| 亚洲黄色毛片| 在线精品福利| 欧美一区二区三区在| 亚洲在线成人| 欧美国产日韩xxxxx| 欧美成人乱码一区二区三区| 国产女优一区| 亚洲网站视频| 亚洲一区三区电影在线观看| 欧美激情视频一区二区三区免费 | 激情综合久久| 亚洲欧美激情一区| 亚洲欧美在线x视频| 欧美三级视频| 亚洲日本成人在线观看| 亚洲第一页在线| 久久久国产精品一区| 国产欧美综合在线| 在线视频日韩| 一本久道久久综合狠狠爱| 亚洲破处大片| 久久野战av| 女女同性女同一区二区三区91| 国语自产精品视频在线看8查询8 | 亚洲精品一二| 蜜桃伊人久久| 亚洲国产高潮在线观看| 亚洲精品国产精品乱码不99按摩| 麻豆av一区二区三区| 欧美成人情趣视频| 亚洲欧洲在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美大秀在线观看| 99国产精品久久久久久久| 欧美精品aa| 中国成人在线视频| 欧美伊久线香蕉线新在线| 国产日韩欧美精品在线| 欧美在线影院| 亚洲第一毛片| 亚洲男人第一网站| 国产婷婷色一区二区三区| 久久精品72免费观看| 亚洲大片在线| 亚洲一区二区三区免费观看| 国产精品呻吟| 久久亚洲一区| 99v久久综合狠狠综合久久| 亚洲欧美日韩国产一区| 国产欧美综合一区二区三区| 久久综合福利| 一区二区高清在线| 噜噜噜噜噜久久久久久91| 99精品欧美一区| 国产日韩欧美| 欧美黑人在线观看| 亚洲欧美日韩第一区| 欧美激情一区二区三区成人| 午夜日韩电影| 亚洲缚视频在线观看| 欧美性久久久| 久久综合色88| 亚洲欧美激情一区二区| 亚洲国产中文字幕在线观看| 久久精品成人一区二区三区| 亚洲高清二区| 国产精品入口麻豆原神| 欧美91大片| 欧美影院成年免费版| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲欧美日韩精品| 亚洲精品网址在线观看| 国产在线一区二区三区四区 | 亚洲综合另类| 亚洲乱码国产乱码精品精| 久久亚洲免费| 午夜精品亚洲一区二区三区嫩草| 亚洲激情网站| 伊人久久大香线蕉综合热线| 欧美午夜视频在线观看| 免费观看欧美在线视频的网站| 亚洲在线观看视频| 日韩西西人体444www| 欧美刺激性大交免费视频| 国语自产精品视频在线看抢先版结局 | 久久精品中文字幕免费mv| 日韩午夜免费| 黄网动漫久久久| 国产精品免费在线| 欧美日韩国产麻豆| 欧美国产高清| 欧美成人高清视频| 久久久久欧美| 久久久精品欧美丰满|