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

            制作波浪(1)

            Posted on 2008-11-26 22:59 Herbert 閱讀(962) 評(píng)論(1)  編輯 收藏 引用 所屬分類: DirectX
              最近在研究波浪的制作,但在網(wǎng)上很難找到一些詳細(xì)地介紹如何制作3D波浪的文章。后來(lái)找到了NVIDIA 的一本書(shū)《GPU Gems》,剛好在第一章就講到了如何制作波浪,所用到的算法是 Fast Fourier Transform (FFT)。下面簡(jiǎn)單地對(duì)它作一個(gè)解讀。
               先來(lái)想以下波浪是怎么形成的。
               在海洋中,大多數(shù)波浪是由風(fēng)產(chǎn)生的。急速流動(dòng)的空氣推動(dòng)一些水分子聚集起來(lái),掀起洶涌的浪花——海面特定位點(diǎn)的擾動(dòng)。這些分子推動(dòng)相鄰的分子,相鄰的那些分子進(jìn)而又推動(dòng)與其相鄰的另一些分子,就這樣推動(dòng)下去。通過(guò)這種方式,擾動(dòng)沿著海面?zhèn)鞑ラ_(kāi)來(lái),而單個(gè)水分子卻大致停留在同一區(qū)域。 
              從波浪的橫截面上看,很像正弦曲線,不同之處在于:正弦曲線波峰和波谷的弧度都一樣;而波浪的波峰比較尖,波谷比較平滑。

               下面來(lái)研究這個(gè)波浪的計(jì)算公式。先做以下約定:

            L : 一個(gè)周期的波浪長(zhǎng)度

            w: 頻率;( w = 2 *п / L

            A: 幅度

            S: 速度

            φ: 相位(φ= S * 2 *φ / L

            D: 波矢量

            W(x,y,t) : t 時(shí)刻,處于 x,y)位置的點(diǎn)受到一個(gè)波浪中心的影響而形成的高度

            H(x,y,t): t 時(shí)刻,處于 x,y)位置的點(diǎn)受到所有波浪中心的影響而形成的高度(該點(diǎn)的實(shí)際高度)

            P(x, y,t): t 時(shí)刻,頂點(diǎn)的實(shí)際坐標(biāo)


               在這里或者還要說(shuō)明一下,海上的波浪可能是由多個(gè)不同中心的波浪共同作用而形成的,而W(x,y,t) 求的是一個(gè)波浪的影響,H(x,y,t)求的是所有波浪的影響。
               研究某一點(diǎn)所受到的影響主要有兩個(gè),一個(gè)是計(jì)算某一時(shí)刻某一點(diǎn)的實(shí)際位置;另外一個(gè)是計(jì)算某一時(shí)刻某一點(diǎn)的法向量。下面先來(lái)研究如何計(jì)算某一時(shí)刻某一點(diǎn)的實(shí)際位置。
              
             

              我們可以設(shè)計(jì)一個(gè)水體類 GWater, 一個(gè)波浪類 GWave 。GWater 負(fù)責(zé)計(jì)算某一點(diǎn)的實(shí)際位置(即受到所有波浪影響后的實(shí)際位置)。GWave 負(fù)責(zé)記錄的信息有:

            L : 一個(gè)周期的波浪長(zhǎng)度

            w: 頻率;( w = 2 *п / L

            A: 幅度

            S: 速度

            φ: 相位(φ= S * 2 *φ / L

               而
            D (波矢量)的計(jì)算還要涉及到具體的某個(gè)點(diǎn)的x和z坐標(biāo)分量。
               一個(gè)GWater 里面可以有一個(gè)或多個(gè)GWave對(duì)象。

              我做了一個(gè)簡(jiǎn)單的實(shí)現(xiàn),下面是運(yùn)行效果:

              1、一個(gè)波浪中心:


            2、兩個(gè)波浪中心:

              
            下面是我實(shí)現(xiàn)的源代碼:

               

            GWater.h 

            //************************************************************

            //說(shuō)明:生成水體

            //作者:何家勉

            //創(chuàng)建日期:年月日

            //修改日期:年月日

            //版權(quán)所有Copyright (c) 2008

            //************************************************************

            #ifndef _GWater_H_

            #define _GWater_H_

             

             

            #include "GQuadTree.h"

            #include "GObject.h"

             

             

             

            namespace OpenAE

            {

             

             

             

            //------------------------------------------------------------

            //說(shuō)明:波浪類

            //------------------------------------------------------------

            class GWave

            {

            private:

             

                float         m_fSpeed; //速度

                float         m_fSwing; //振幅A

                float         m_fCycleLength; //一個(gè)周期的長(zhǎng)度

                D3DXVECTOR3       m_vCenter; //

             

             

                //------------- 下面變量可以由上面的變量求得,

                //因此只起到減少重復(fù)計(jì)算的作用--------------

                float         m_fFrequency; //頻率

                float         m_fPhase; //相位

               

                float         m_fAlpha; // sin( m_fAlpha)

             

            public:

                GWave(){};

                ~GWave(){};

             

            //------------------------------------------------------------

            //desc: 構(gòu)造函數(shù)

            //param: fSpeed 速度

            //param: fSwing 幅度

            //param: fCycleLength 一個(gè)周期的波長(zhǎng)

            //param: vCenter 波浪的中心

            //------------------------------------------------------------

                GWave( float fSpeed, float fSwing, D3DXVECTOR3 vCenter)

                {

                   m_fSpeed = fSpeed;

                   m_fSwing = fSwing;

                   m_fCycleLength = fSpeed * 2.0f * D3DX_PI;

                   m_vCenter = vCenter;

             

                }

             

             

            //------------------------------------------------------------

            //desc: 獲取波浪中心到某點(diǎn)的向量的值

            //param: staticX 點(diǎn)的x分量

            //param: statixZ 點(diǎn)的z分量

            //return: 向量的值

            //------------------------------------------------------------

                float GetDirectionValue(float staticX, float staticZ)

                {

                   float fSign; //決定正負(fù)號(hào)

                   //fSign = ( ( staticZ - m_vCenter.z ) >= 0 ) ? 1.0f : -1.0f;

                   fSign = -1.0f;

             

                   float fXLen = ( staticX - m_vCenter.x) * ( staticX - m_vCenter.x);

                   float fZLen = ( staticZ - m_vCenter.z) * ( staticZ - m_vCenter.z);

                   float fValue = sqrt( fXLen + fZLen) * fSign;

             

                   return fValue;

                }

             

             

            //------------------------------------------------------------

            //desc: 獲取波浪中心到某點(diǎn)的向量的x分量值

            //param: staticX 點(diǎn)的x分量

            //return: 向量的x分量值

            //------------------------------------------------------------

                float GetDirectionX(float staticX){ return staticX - m_vCenter.x;}

             

             

            //------------------------------------------------------------

            //desc: 獲取波浪中心到某點(diǎn)的向量的z分量值

            //param: statixZ 點(diǎn)的z分量

            //return: 向量的z分量值

            //------------------------------------------------------------

                float GetDirectionZ(float staticZ){ return staticZ - m_vCenter.z;}

             

             

             

             

            //------------------------------------------------------------

            //desc: 以下是一系列Get Set操作

            //------------------------------------------------------------

                void   SetSpeed( float fSpeed){ m_fSpeed = fSpeed;}

                float GetSpeed(){ return m_fSpeed;}

             

                void   SetSwing( float fSwing){ m_fSwing = fSwing;}

                float GetSwing(){ return m_fSwing;}

             

                void   SetCycleLength(float fLength){ m_fCycleLength = fLength;}

                float GetCycleLength(){ return m_fCycleLength;}

             

                void   SetCenter( D3DXVECTOR3 vCenter){ m_vCenter = vCenter;}

                D3DXVECTOR3 GetCenter(){ return m_vCenter;}

             

                float GetFrequency(){ return m_fFrequency;}

                float GetPhase(){ return m_fPhase;}

             

             

            //------------------------------------------------------------

            //desc: 在每次循環(huán)調(diào)用次類時(shí)都要先調(diào)用此方法,用于初始化某些變量

            //------------------------------------------------------------

                void   PreUpdate()

                {

                   m_fFrequency = CalculateFrequency(); //計(jì)算頻率

                   m_fPhase = CalculatePhase();       //計(jì)算相位

                }

             

             

            private:

             

            //------------------------------------------------------------

            //desc: 計(jì)算頻率

            //return: 返回頻率

            //------------------------------------------------------------

                float CalculateFrequency()

                {

                   return 2.0f * D3DX_PI / m_fCycleLength;

                }

             

             

            //------------------------------------------------------------

            //desc: 計(jì)算相位

            //return: 返回相位

            //------------------------------------------------------------

                float CalculatePhase()

                {

                   return m_fSpeed * 2.0f * D3DX_PI / m_fCycleLength;

                }

             

             

             

            };

             

             

             

             

             

             

            //------------------------------------------------------------

            //說(shuō)明:水體類

            //------------------------------------------------------------

            class GWater : public GObject

            {

            private:

             

                GQuadTree *              m_pQuadTree; //四叉樹(shù)

             

                D3DXVECTOR3              m_vCenter; //水體的中心

                float                m_fWidth; //水體寬度

                float                m_fHeight; //水體高度

                UINT                 m_iLineNum;   //水體網(wǎng)格中橫向或縱向的網(wǎng)格線條數(shù)

             

             

                float                m_fCurTime; //當(dāng)前時(shí)間

                float                m_fTimeStep; //最小單位時(shí)間

             

                std::vector< GWave *>    m_vWaves; //波浪列表

             

                LPDIRECT3DVERTEXBUFFER9 m_pVB;//頂點(diǎn)緩沖

                LPDIRECT3DINDEXBUFFER9 m_pIB; //索引緩沖

             

            public:

             

                //水的頂點(diǎn)結(jié)構(gòu)

                struct WaterVertex

                {

                   D3DXVECTOR3 pos;

                   D3DCOLOR   color;

                   static const DWORD FVF;

                };

             

             

             

                GWater(void);

                ~GWater(void);

             

             

            //------------------------------------------------------------

            //desc: 創(chuàng)建頂點(diǎn)索引緩沖

            //param: fWidth 寬度

            //param: fHeight 高度

            //param: iLinesParam 決定線條個(gè)數(shù)(縱向線條條數(shù)= 橫向線條條數(shù)= 2 ^ iLinesParam + 1

            //param: vCenter 中心

            //return: 返回操作是否成功

            //------------------------------------------------------------

                GWater( LPDIRECT3DDEVICE9 pDev, float fWidth, float fHeight, int iLinesParam, float fTimeStep, D3DXVECTOR3 vCenter);

             

             

             

            //------------------------------------------------------------

            //desc: 更新

            //param: fTime 時(shí)間

            //------------------------------------------------------------

                void FrameMove( float fTime);

             

             

             

            //------------------------------------------------------------

            //desc: 渲染

            //param: pDev 設(shè)備

            //------------------------------------------------------------

                void Render(LPDIRECT3DDEVICE9 pDev);

             

             

             

            //------------------------------------------------------------

            //desc: 銷毀

            //------------------------------------------------------------

                void Destroy();

             

             

            //------------------------------------------------------------

            //desc: 創(chuàng)建一個(gè)波浪

            //param: fSpeed 速度

            //param: fSwing 幅度

            //param: fCycleLength 一個(gè)周期的波長(zhǎng)

            //param: vCenter 波浪的中心

            //------------------------------------------------------------

                void CreateWave( float fSpeed, float fSwing, D3DXVECTOR3 vCenter)

                {

                   GWave * pWave = new GWave( fSpeed, fSwing, vCenter);

                   m_vWaves.push_back( pWave);

                }

             

             

            private:

             

            //------------------------------------------------------------

            //desc: 創(chuàng)建頂點(diǎn)索引緩沖

            //param: fWidth 寬度

            //param: fHeight 高度

            //param: iLineNum 橫向縱向網(wǎng)格個(gè)數(shù)

            //param: vCenter 中心

            //return: 返回操作是否成功

            //------------------------------------------------------------

                HRESULT GWater::CreateVIB( LPDIRECT3DDEVICE9 pDev, float fWidth, float fHeight, int iLineNum, D3DXVECTOR3 vCenter);

             

             

            //------------------------------------------------------------

            //desc: 繪制水體

            //param: pDev 設(shè)備

            //param: iTrangleNum 要畫(huà)的三角形個(gè)數(shù)

            //------------------------------------------------------------

                void Draw(LPDIRECT3DDEVICE9 pDev, UINT iTrangleNum);

             

             

            //------------------------------------------------------------

            //desc: 更新波浪

            //param: fTime 時(shí)間

            //------------------------------------------------------------

                void UpdateWave( float fTime);

             

             

            //------------------------------------------------------------

            //desc: 獲取某坐標(biāo)位置的實(shí)際位置

            //param: staticX 靜止時(shí)的坐標(biāo)x分量

            //param: staticZ 靜止時(shí)的坐標(biāo)z分量

            //param: time 時(shí)間

            //return: 返回實(shí)際的坐標(biāo)位置

            //------------------------------------------------------------

                D3DXVECTOR3 GetRealTimePosition(float staticX, float staticZ, float time);

             

             

             

             

            //------------------------------------------------------------

            //desc: 獲取某坐標(biāo)位置的實(shí)際法向量

            //param: staticX 靜止時(shí)的坐標(biāo)x分量

            //param: staticZ 靜止時(shí)的坐標(biāo)z分量

            //param: time 時(shí)間

            //return: 返回實(shí)際法向量

            //------------------------------------------------------------

                D3DXVECTOR3 GetRealTimeNormal(float staticX, float staticZ, float time);

             

             

             

            //------------------------------------------------------------

            //desc: 獲取某坐標(biāo)位置的實(shí)際高度

            //param: staticX 靜止時(shí)的坐標(biāo)x分量

            //param: staticZ 靜止時(shí)的坐標(biāo)z分量

            //param: time 時(shí)間

            //return: 返回實(shí)際的高度

            //------------------------------------------------------------

                float GetRealTimeHeight(float staticX, float staticZ, float time);

             

             

            //------------------------------------------------------------

            //desc: 獲取某坐標(biāo)位置受到某波浪中心影響獲得的實(shí)際高度

            //param: staticX 靜止時(shí)的坐標(biāo)x分量

            //param: staticZ 靜止時(shí)的坐標(biāo)z分量

            //param: time 時(shí)間

            //param: pWave 波浪指針

            //return: 返回實(shí)際的高度

            //------------------------------------------------------------

                float GetHeightAffectByWave(float staticX, float staticZ, float time, GWave * pWave);

             

             

             

            //------------------------------------------------------------

            //desc: 獲取某點(diǎn)對(duì)x求導(dǎo)(用于求頂點(diǎn)法向量)

            //param: staticX 靜止時(shí)的坐標(biāo)x分量

            //param: staticZ 靜止時(shí)的坐標(biāo)z分量

            //param: time 時(shí)間

            //return: 返回導(dǎo)數(shù)

            //------------------------------------------------------------

                float GetHdx(float staticX, float staticZ, float time);

             

             

             

            //------------------------------------------------------------

            //desc: 獲取某點(diǎn)對(duì)z求導(dǎo)(用于求頂點(diǎn)法向量)

            //param: staticX 靜止時(shí)的坐標(biāo)x分量

            //param: staticZ 靜止時(shí)的坐標(biāo)z分量

            //param: time 時(shí)間

            //return: 返回導(dǎo)數(shù)

            //------------------------------------------------------------

                float GetHdz(float staticX, float staticZ, float time);

            };

             

             

             

             

             

            }

             

             

             

            #endif

             

              


             

            Feedback

            # re: 制作波浪(1)  回復(fù)  更多評(píng)論   

            2009-12-25 12:02 by Bill Hsu
            制作波浪(2)怎么沒(méi)寫(xiě)呢?
            精品无码久久久久久国产| 久久久一本精品99久久精品66| 97久久精品人妻人人搡人人玩| 99久久成人国产精品免费| 国产精品一区二区久久精品无码| 一本大道久久香蕉成人网| 久久久亚洲AV波多野结衣 | 久久久亚洲欧洲日产国码二区| 精品国产乱码久久久久久郑州公司 | 热久久国产欧美一区二区精品| 亚洲av成人无码久久精品 | 色天使久久综合网天天| 欧美精品久久久久久久自慰| 国产精品久久久99| 国产精品久久久久国产A级| 亚洲精品无码久久毛片| 久久99精品国产一区二区三区| 精品伊人久久久| 久久男人AV资源网站| 青青青伊人色综合久久| 无码伊人66久久大杳蕉网站谷歌| 国产成人久久精品二区三区| 久久久久亚洲精品无码蜜桃| 精品国产日韩久久亚洲| 久久久久国产一区二区三区| 亚洲午夜久久影院| 999久久久免费国产精品播放| 久久久噜噜噜久久熟女AA片| 久久精品人妻中文系列| 久久这里有精品视频| 久久最新免费视频| 欧美亚洲另类久久综合婷婷| 91久久精品国产成人久久| 久久国产免费观看精品| 国产精品久久久久9999| 韩国三级大全久久网站| 亚洲综合久久综合激情久久| 88久久精品无码一区二区毛片| 欧美综合天天夜夜久久| 国内精品欧美久久精品| 三级韩国一区久久二区综合|