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

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

            創(chuàng)建游戲內(nèi)核(5)【C風(fēng)格版】

             

            本篇是創(chuàng)建游戲內(nèi)核(4)【C風(fēng)格版】的續(xù)篇,關(guān)于該內(nèi)核的細(xì)節(jié)說明請參考創(chuàng)建游戲內(nèi)核(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);

            實(shí)現(xiàn):

            //-------------------------------------------------------------------------
            // 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 閱讀(189) 評論(0)  編輯 收藏 引用


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


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評論

            青青热久久国产久精品| 久久九九久精品国产免费直播| 亚洲精品乱码久久久久久不卡| 久久久久亚洲AV综合波多野结衣| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久久久成人精品无码 | 99久久99久久精品国产片| 99久久久国产精品免费无卡顿 | 久久99精品久久久久久9蜜桃| www亚洲欲色成人久久精品| 久久亚洲中文字幕精品一区四| A级毛片无码久久精品免费| 久久精品国产半推半就| 亚洲午夜久久久| 久久精品国产半推半就| 久久精品国产欧美日韩99热| 国产精品久久影院| 看久久久久久a级毛片| 久久人人爽人人爽人人片AV麻豆 | 无码人妻久久一区二区三区蜜桃| 日本久久久久亚洲中字幕| 久久国产精品二国产精品| 奇米综合四色77777久久| 一本大道久久东京热无码AV| 94久久国产乱子伦精品免费| 久久精品中文闷骚内射| 97久久婷婷五月综合色d啪蜜芽| 久久国产视屏| 久久精品免费观看| 久久ZYZ资源站无码中文动漫| 国产精品久久久久蜜芽| 日韩一区二区三区视频久久| 国产成人精品久久亚洲高清不卡| 久久99国产精品尤物| 日韩精品久久久肉伦网站| 少妇内射兰兰久久| 久久久av波多野一区二区| 久久国产精品无码一区二区三区| 久久亚洲精品无码AV红樱桃| 久久AV无码精品人妻糸列| 综合人妻久久一区二区精品|