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

天行健 君子當自強而不息

創建游戲內核(5)【C風格版】

 

本篇是創建游戲內核(4)【C風格版】的續篇,關于該內核的細節說明請參考創建游戲內核(5)

 

接口:

typedef struct WORLD_POS
{
    BOOL use_billboard;                 
// flag indicates whether use billboard

    
float x_pos, y_pos, z_pos;          // current position
    float x_rot, y_rot, z_rot;          // cuurent rotation
    float x_scale, y_scale, z_scale;    // current 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
} *WORLD_POS_PTR;

WORLD_POS_PTR create_world_pos();
void destroy_world_pos(WORLD_POS_PTR world_pos);

void clone_world_pos(WORLD_POS_PTR dest, const WORLD_POS_PTR source);

void move_world_pos(WORLD_POS_PTR world_pos, 
                    
float x_pos, float y_pos, float z_pos);

void move_world_pos_rel(WORLD_POS_PTR world_pos, 
                        
float x_add, float y_add, float z_add);

void rotate_world_pos(WORLD_POS_PTR world_pos, 
                      
float x_rot, float y_rot, float z_rot);

void rotate_world_pos_rel(WORLD_POS_PTR world_pos, 
                          
float x_add, float y_add, float z_add);

void scale_world_pos(WORLD_POS_PTR world_pos, 
                     
float x_scale, float y_scale, float z_scale);

void scale_world_pos_rel(WORLD_POS_PTR world_pos, 
                         
float x_add, float y_add, float z_add);

void update_world_pos(WORLD_POS_PTR world_pos);

實現:

//-------------------------------------------------------------------------
// create world position object.
//-------------------------------------------------------------------------
WORLD_POS_PTR create_world_pos()
{
    WORLD_POS_PTR world_pos = (WORLD_POS_PTR) malloc(
sizeof(WORLD_POS));

    memset(world_pos, 0, 
sizeof(WORLD_POS));

    world_pos->use_billboard = TRUE;
    world_pos->x_scale = world_pos->y_scale = world_pos->z_scale = 1.0f;

    update_world_pos(world_pos);
    
    
return world_pos;
}

//-------------------------------------------------------------------------
// destroy world position object.
//-------------------------------------------------------------------------
void destroy_world_pos(WORLD_POS_PTR world_pos)
{
    free(world_pos);
}

//-------------------------------------------------------------------------
// clone world position information to another world position object.
//-------------------------------------------------------------------------
void clone_world_pos(WORLD_POS_PTR dest, const WORLD_POS_PTR source)
{        
    move_world_pos(dest, source->x_pos, source->y_pos, source->z_pos);
    rotate_world_pos(dest, source->x_rot, source->y_rot, source->z_rot);
    scale_world_pos(dest, source->x_scale, source->y_scale, source->z_scale);
    
    dest->use_billboard = source->use_billboard;    
}

//-------------------------------------------------------------------------
// move to new world position with specified relative value.
//-------------------------------------------------------------------------
void move_world_pos(WORLD_POS_PTR world_pos, 
                    
float x_pos, float y_pos, float z_pos)
{    
    world_pos->x_pos = x_pos;
    world_pos->y_pos = y_pos;
    world_pos->z_pos = z_pos;

    D3DXMatrixTranslation(&world_pos->mat_translation, x_pos, y_pos, z_pos);
}

//-------------------------------------------------------------------------
// move to new world position which relative to current position.
//-------------------------------------------------------------------------
void move_world_pos_rel(WORLD_POS_PTR world_pos, 
                        
float x_add, float y_add, float z_add)
{    
    move_world_pos(world_pos, 
        world_pos->x_pos + x_add, world_pos->y_pos + y_add, world_pos->z_pos + z_add);
}

//-------------------------------------------------------------------------
// rotate around x, y, z, axis with specified degree.
//-------------------------------------------------------------------------
void rotate_world_pos(WORLD_POS_PTR world_pos, 
                      
float x_rot, float y_rot, float z_rot)
{    
    world_pos->x_rot = x_rot;
    world_pos->y_rot = y_rot;
    world_pos->z_rot = z_rot;

    
// Builds a matrix with a specified yaw, pitch, and roll.
    D3DXMatrixRotationYawPitchRoll(&world_pos->mat_rotation, y_rot, x_rot, z_rot);
}

//-------------------------------------------------------------------------
// rotate around x, y, z, axis which relative to cuurent x, y, z angle.
//-------------------------------------------------------------------------
void rotate_world_pos_rel(WORLD_POS_PTR world_pos, 
                          
float x_add, float y_add, float z_add)
{   
    rotate_world_pos(world_pos, 
        world_pos->x_rot + x_add, world_pos->y_rot + y_add, world_pos->z_rot + z_add);    
}

//-------------------------------------------------------------------------
// Scale world position.
//-------------------------------------------------------------------------
void scale_world_pos(WORLD_POS_PTR world_pos, 
                     
float x_scale, float y_scale, float z_scale)
{    
    world_pos->x_scale = x_scale;
    world_pos->y_scale = y_scale;
    world_pos->z_scale = z_scale;

    D3DXMatrixScaling(&world_pos->mat_scale, x_scale, y_scale, z_scale);
}

//-------------------------------------------------------------------------
// Scale world position which relative to current scale value.
//-------------------------------------------------------------------------
void scale_world_pos_rel(WORLD_POS_PTR world_pos, 
                         
float x_add, float y_add, float z_add)
{
    scale_world_pos(world_pos, 
        world_pos->x_pos + x_add, world_pos->y_pos + y_add, world_pos->z_pos + z_add);
}

//-------------------------------------------------------------------------
// Update world transformation matrix.
//-------------------------------------------------------------------------
void update_world_pos(WORLD_POS_PTR world_pos)
{   
    D3DXMATRIX mat_view, mat_transposed;    

    
// setup billboarding matrix
    if(world_pos->use_billboard)
    {        
        g_d3d_device->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;        
    }

    
// combine scaling and rotation matrices first
    D3DXMatrixMultiply(&world_pos->mat_world, &world_pos->mat_scale, &world_pos->mat_rotation);

    
// apply billboard matrix
    if(world_pos->use_billboard)
        D3DXMatrixMultiply(&world_pos->mat_world, &world_pos->mat_world, &mat_transposed);

    
// combine with translation matrix
    D3DXMatrixMultiply(&world_pos->mat_world, &world_pos->mat_world, &world_pos->mat_translation);

    
// combine with combined matrices (if any)

    
if(world_pos->mat_combine_1)
        D3DXMatrixMultiply(&world_pos->mat_world, &world_pos->mat_world, world_pos->mat_combine_1);

    
if(world_pos->mat_combine_2)
        D3DXMatrixMultiply(&world_pos->mat_world, &world_pos->mat_world, world_pos->mat_combine_2);
}

 

posted on 2007-10-25 20:21 lovedday 閱讀(196) 評論(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>
            亚洲国产三级网| 亚洲精品三级| 欧美在线一二三四区| 国产精品自在线| 久久―日本道色综合久久| 久久激情视频| 亚洲国产一区在线观看| 91久久久亚洲精品| 欧美日韩免费网站| 欧美一进一出视频| 久久精品欧洲| 99精品视频免费观看| 正在播放亚洲一区| 国产亚洲精品成人av久久ww| 久久综合影音| 欧美日韩少妇| 久久久国产精品一区| 欧美成人中文字幕| 亚洲女性喷水在线观看一区| 欧美与欧洲交xxxx免费观看| 91久久视频| 亚洲欧美在线高清| 最新热久久免费视频| 中文精品99久久国产香蕉| 国内精品视频在线观看| 亚洲国产一成人久久精品| 国产精品久久久久久户外露出| 久久久精品国产一区二区三区| 欧美不卡高清| 久久久久网站| 欧美三级电影一区| 欧美电影免费| 国产日韩欧美91| 日韩亚洲欧美在线观看| 韩国欧美一区| 亚洲性图久久| 日韩视频在线一区| 久久精品日产第一区二区三区| 日韩午夜中文字幕| 久久天堂精品| 久久九九精品99国产精品| 欧美日韩一区二区三区视频 | 模特精品在线| 欧美一区二区免费| 欧美日韩亚洲成人| 欧美激情bt| 伊人久久大香线| 香蕉av福利精品导航| 99精品国产高清一区二区| 久久久亚洲一区| 久久久精品日韩欧美| 国产精品女人久久久久久| 亚洲欧洲精品天堂一级 | 麻豆九一精品爱看视频在线观看免费 | 欧美在线|欧美| 午夜精品影院| 国产精品免费看久久久香蕉| 亚洲日本中文| 99精品久久久| 欧美激情1区| 亚洲国产成人精品女人久久久| 国模大胆一区二区三区| 亚洲专区国产精品| 欧美亚洲免费电影| 国产精品视屏| 欧美亚洲综合久久| 小黄鸭精品密入口导航| 国产精品日日做人人爱| 在线一区观看| 欧美在线电影| 国户精品久久久久久久久久久不卡 | 欧美中文在线观看| 国产午夜亚洲精品理论片色戒| 亚洲欧美日韩天堂| 久久全球大尺度高清视频| 国内精品久久久久影院薰衣草| 久久高清国产| 欧美国产第一页| 亚洲精选在线观看| 欧美日韩在线视频一区| 亚洲小视频在线观看| 亚洲欧美国产va在线影院| 国产精品视频区| 久久久综合精品| 亚洲黄色一区二区三区| 亚洲视屏一区| 国产一区二区成人| 欧美成人免费网| 99re成人精品视频| 久久精品国产免费| 亚洲成色999久久网站| 欧美金8天国| 亚洲欧美激情视频在线观看一区二区三区| 久久爱91午夜羞羞| 在线日韩av片| 国产精品国产三级国产aⅴ无密码| 亚洲欧美国产精品桃花| 农夫在线精品视频免费观看| 在线一区二区视频| 国产午夜精品麻豆| 欧美日韩国产成人高清视频| 香蕉亚洲视频| 亚洲伦理中文字幕| 麻豆av福利av久久av| 最近中文字幕mv在线一区二区三区四区| 欧美欧美天天天天操| 校园春色国产精品| 亚洲人成久久| 狂野欧美一区| 亚洲综合成人婷婷小说| 亚洲国产精品一区二区尤物区 | 久久日韩粉嫩一区二区三区| 亚洲精品亚洲人成人网| 久久午夜电影| 亚洲综合激情| 亚洲美女视频在线观看| 国产亚洲精品v| 国产精品久久久久久久9999| 欧美大尺度在线| 久久精品观看| 午夜激情亚洲| 亚洲天堂久久| 亚洲国产日韩欧美综合久久| 麻豆av福利av久久av| 午夜亚洲性色视频| 中文精品在线| 洋洋av久久久久久久一区| 136国产福利精品导航| 国产精品人人做人人爽人人添| 欧美激情视频一区二区三区免费 | 久久久久久高潮国产精品视| 亚洲午夜免费视频| 一本一本a久久| 亚洲免费福利视频| 亚洲精品美女91| 亚洲国产精品va在看黑人| 久久综合网络一区二区| 久久久精品五月天| 久久九九国产精品怡红院| 性欧美xxxx大乳国产app| 亚洲欧美精品一区| 亚洲欧美日韩国产| 亚洲欧美日韩国产中文| 亚洲一区二区精品在线| 亚洲午夜精品国产| 亚洲欧美日韩电影| 香蕉尹人综合在线观看| 欧美在线一区二区| 久久久91精品国产一区二区精品| 性伦欧美刺激片在线观看| 欧美一区二区在线播放| 欧美在线亚洲在线| 久久九九国产精品| 欧美不卡视频| 亚洲精品国产品国语在线app| 亚洲欧洲精品一区二区三区 | 毛片基地黄久久久久久天堂| 免费国产一区二区| 亚洲国产精品一区二区第一页| 亚洲激情av在线| 99精品黄色片免费大全| 亚洲天堂av高清| 久久av资源网| 麻豆精品一区二区综合av | 久久久精品免费视频| 欧美freesex8一10精品| 欧美精品在线免费| 国产精品久久久久久久浪潮网站| 国产伪娘ts一区| 亚洲国产日韩在线| 亚洲综合色婷婷| 老司机免费视频一区二区| 91久久精品国产91性色| 亚洲无线视频| 久久中文久久字幕| 欧美午夜一区| 精品不卡在线| 亚洲永久免费| 欧美xx69| 亚洲欧美日韩国产综合在线| 久久亚洲国产成人| 国产精品美女久久久久久免费| 狠狠综合久久| 亚洲天堂久久| 欧美国产一区二区| 亚洲在线免费视频| 欧美/亚洲一区| 国产日韩一区欧美| 99日韩精品| 裸体一区二区| 午夜精品久久久久久久蜜桃app | 久久国产99| 国产精品sm| 亚洲日本欧美| 美女尤物久久精品| 亚洲伊人一本大道中文字幕| 欧美韩国一区| 加勒比av一区二区| 欧美综合77777色婷婷| 亚洲美女黄色|