• <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>

            天行健 君子當自強而不息

            創建游戲內核(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 閱讀(186) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            成人久久综合网| 国产精品永久久久久久久久久 | 久久久国产乱子伦精品作者| 人妻无码精品久久亚瑟影视| 国产精品99久久久精品无码| 国产精品久久久久久吹潮| 欧美一级久久久久久久大| 久久久久99精品成人片欧美| 四虎国产精品免费久久5151| 模特私拍国产精品久久| 国产精品久久久久蜜芽| 久久狠狠一本精品综合网| 99久久精品影院老鸭窝| 免费精品久久久久久中文字幕| 久久精品中文无码资源站| 国产婷婷成人久久Av免费高清 | 国产毛片久久久久久国产毛片| 久久久久亚洲av毛片大| 久久久久亚洲AV成人网人人软件| 国产精品伊人久久伊人电影| 国产激情久久久久影院老熟女| 怡红院日本一道日本久久 | 久久99精品久久久久久hb无码| 久久久久久精品久久久久| 久久99国产精品久久99小说 | 久久夜色精品国产噜噜亚洲AV | 色欲久久久天天天综合网精品| 老司机国内精品久久久久| 久久精品嫩草影院| 久久免费看黄a级毛片| 久久久国产乱子伦精品作者| 精品人妻伦九区久久AAA片69| 国产精品福利一区二区久久| 色婷婷噜噜久久国产精品12p| 久久综合狠狠综合久久97色| 久久国产高清字幕中文| 国产V综合V亚洲欧美久久| 国内精品久久人妻互换| 久久亚洲国产成人精品性色| 久久电影网2021| 亚洲αv久久久噜噜噜噜噜|