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

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            模擬世界1----物理引擎概述

            http://hi.baidu.com/refactor/blog/item/6e4d5aafe9b389f9faed506a.html

                             模擬世界1----物理引擎概述 by no5
                                                         This doc is free as long as the auther is mentioned.

                    第零節(jié). "Make it real." ----某公司廣告語。
                    對(duì)于大多數(shù)玩家來說,也許是HalfLife2第一次把"物理"這個(gè)詞和3D游戲聯(lián)系起來。按部就
            班升級(jí)的3D圖形效果突然被注入了一種鮮活的元素。物理效果從被玩家廣泛認(rèn)知起,就注定成為下
            一代主流視頻游戲中不可或缺的組成部分。我們不妨來看看主流游戲引擎,Unreal3集成了Ageia的
            PhysX,Source2似乎也用PhysX,至于大明星Camark的作品,你要相信他是不可能甘于落后的。
                    然而在國內(nèi),除了Ageia公司的商業(yè)推動(dòng)以外,我們很少能看到有這方面的學(xué)習(xí)和研究。所
            以我打算出品一個(gè)"模擬世界"系列,寫一點(diǎn)介紹性質(zhì)的文章,翻譯一些經(jīng)典的論文。一方面作為自
            己學(xué)習(xí)的總結(jié)與加深,另一方面也算是為中國的游戲制作圈做點(diǎn)貢獻(xiàn)----如果你認(rèn)為我有這么偉大
            的話。(鄭重聲明1我很懶,鄭重聲明2我不資深)


                    第一節(jié). Hello, simulation world!
                    我們從這樣一個(gè)場(chǎng)景開始:包含重力的二維世界,一個(gè)水平線作為地面,一個(gè)圓作為我們要
            模擬的動(dòng)態(tài)物體,暫不考慮轉(zhuǎn)動(dòng)。我想稍微懂得編程的人都能把這個(gè)場(chǎng)景模擬出來:
                     用一個(gè)二維的向量代表圓的速度: vel.
                     另一個(gè)二維的向量代表圓的位置: pos.
                     for every time_step:
                    {
                        vel += gravity_acceleration * time_step;
                        pos += vel * time_step;
                     }
                     這樣就OK了?哦,還要加入對(duì)地面的碰撞處理,變成這樣:
                     for every time step:
                    {
                       if(circle penetrate the ground):
                            vel.y = -vel.y;
                        vel += gravity_acceleration * time_step;
                        pos += vel * time_step;
                     }
            這樣,一個(gè)最簡(jiǎn)單的物理模擬器就完成了,當(dāng)然你可以設(shè)置任意的初始位置與速度。如果你真的實(shí)現(xiàn)
            出來,并把場(chǎng)景畫出來,就可以看到小球在地上蹦的效果了。


                    第二節(jié). Show me the real stuff!
                    我清楚你的想法,上面的東西的確弱智了點(diǎn)。(就像面試時(shí)要我打印Fibonacci,我就想只寫
            上"你丫不是讓我遞歸吧") 不過我的hello world不是僅僅用來愚弄大眾的,從小老師就告訴我們,
            小故事大道理嘛。從上面的例子我們可以得出以下結(jié)論:
                    從一個(gè)角度來說,物理模擬分為兩部分,碰撞檢測(cè)和模擬計(jì)算。你要模擬的東西不是單獨(dú)的,
            而是充分交互的,或者說交互才是模擬的核心。既然要交互,碰撞檢測(cè)是必不可少的部分,實(shí)際
            上,就代碼量而言,一個(gè)物理引擎所包含的碰撞檢測(cè)的代碼一般都會(huì)多于模擬計(jì)算的代碼。因?yàn)?br>相對(duì)來說,后者所面對(duì)的問題要單純一些。
                    從另一個(gè)角度來說,物理模擬還是分成兩部分,數(shù)學(xué)建模和數(shù)學(xué)求解。其實(shí)這也是用數(shù)學(xué)處
            理實(shí)際問題的一般規(guī)律。在上面的例子中,我們建立好2D空間,位置,速度的數(shù)學(xué)表示,是建模
            的過程;而在每個(gè)time_step中,對(duì)速度和位置的改變(包括碰撞時(shí)的改變),則是求解的過程。比
            如說為什么碰撞的時(shí)候,把Y向速度反向呢?因?yàn)檫@就是求解的結(jié)果。(當(dāng)然這個(gè)結(jié)果是非常粗糙
            甚至是在某些情況下有問題的)
                    好了,廢話終于說完了,進(jìn)入正題。(首先聲明,本文所討論的只是剛體的模擬,至于其他
            的高級(jí)的(或者稱為不太普及的)模擬,如粒子,布料,暫不涉及。) 現(xiàn)在我預(yù)感到有些同學(xué)將在下
            面的閱讀過程中關(guān)掉瀏覽器,因?yàn)樗麄冇X得太"專業(yè)"了或者沒有深入了解的興趣。為了對(duì)這些同學(xué)所
            付出的閱讀時(shí)間有所交代,我決定專門為他們寫個(gè)結(jié)尾:"在模糊掉很多細(xì)節(jié)的前提下,物理引擎的
            工作流程是這樣,模擬是一楨一楨的進(jìn)行的,每楨中,對(duì)所有的物體進(jìn)行檢測(cè),找出相交互的物體以
            及交互的細(xì)節(jié),并根據(jù)這些信息,通過牛頓力學(xué)原理,對(duì)每個(gè)物體計(jì)算出新的速度,然后利用速度去
            更新物體的方位。"
                    現(xiàn)在大部分同學(xué)都走了,后排的同學(xué)可以往前面坐坐。
                    以下部分的最低系統(tǒng)要求為大學(xué)數(shù)學(xué)和大學(xué)普通物理力學(xué)以及計(jì)算機(jī)圖形學(xué)基本概念。推薦
            配置再加上計(jì)算機(jī)圖形學(xué)和較高級(jí)的理論力學(xué)知識(shí)。首先說說約束(constraint)這個(gè)概念,標(biāo)準(zhǔn)的定
            義可以去參考理論力學(xué)課本。大概就是指兩個(gè)剛體間的相互牽制,比如說桌子和桌子上的茶杯間的牽
            制,活塞和氣缸間的牽制。正是有了約束才使得物理模擬成為一個(gè)課題,否則按照最基本的幾個(gè)力學(xué)
            公式就可以完美模擬剛體了。所以求解約束是物理模擬的核心內(nèi)容。當(dāng)然在求解之前,第一部是對(duì)約
            束進(jìn)行建模。而約束又可以分為兩類,一類是如鉸鏈,活塞等"人為"的約束,被稱之為Joint,這類約
            束建模的已知條件是很清晰的。另一類則是在物體在碰撞或接觸時(shí)產(chǎn)生的約束,這類約束建模則依賴
            于碰撞檢測(cè)。也就是說后一類的約束,要想得到求解,跟前一類不在一個(gè)起跑線上----它先要過碰撞
            檢測(cè)這道關(guān)。所以我們要照顧照顧它,先談?wù)勁鲎矙z測(cè)。
                    碰撞檢測(cè)本身就是個(gè)大題目,涉及到一些基本概念請(qǐng)參考wiki, 本文會(huì)對(duì)其中一些給出幫助
            理解性的解釋。一般物理引擎支持的Shape有:簡(jiǎn)單Shape如Shpere和Box,Convex,TriangleMesh
            (Concave)。其碰撞檢測(cè)一般分成三個(gè)部分,粗測(cè)階段(BroadPhase),細(xì)測(cè)階段(NarrowPhase)和中間
            階段(MiddlePhase),請(qǐng)注意這些名詞的中文翻譯都是我自己想的,其目的僅僅是為了幫助理解,那些
            翻譯出來對(duì)理解沒有幫助的我就不翻了,還望各老師同學(xué)理解。你可能要問為什么我不把MiddlePhase
            排在中間呢,這是因?yàn)樗麅H僅針對(duì)TriangleMesh這種Shape,后面詳述。所謂BroadPhase,就是對(duì)所有
            的Shape進(jìn)行初步檢測(cè),具體做法是檢測(cè)每?jī)蓚€(gè)Shape的包圍盒是否相交,是則送入下一階段處理。這
            里的包圍盒一般是AABB,原因顯然是它的性價(jià)比最好。下一步就是NarrowPhase了,這時(shí),我們必須
            根據(jù)不同類型的Shape給出不同的算法。比如你要支持Sphere和Box兩種Shape的話,就需要實(shí)現(xiàn)
            Sphere_vs_Sphere, Sphere_vs_Box, Box_vs_Box三種算法。顯然,如果你要支持多種Shape,你的算
            法數(shù)量將是很大的。某些簡(jiǎn)單Shape間的檢測(cè)是相對(duì)簡(jiǎn)單的如Sphere_vs_Sphere,Sphere_vs_Box,但
            并不是所有的都如此。所幸的是有一些通用的算法,如SAT和GJK。SAT支持所有的Convex Polyhedron
            ,而GJK更強(qiáng)大,支持所有的Convex。因?yàn)橐话愫?jiǎn)單Shape都是Convex,所以你如果打算只支持Convex
            的話,一個(gè)GJK算法就滿足你的需要了?;蛘呶覀兛梢哉fGJK處理不了的只有TriangleMesh了,由于
            TriangleMesh一般比較大,我們需要借助BVH,找到每一個(gè)可能與其他Shape碰撞的Triangle,再進(jìn)行
            精確檢測(cè)。而這個(gè)中間過程就是所謂MiddlePhase。本段中提及的關(guān)鍵算法,均將在下節(jié)中有詳述。
                    其實(shí)上面的討論中都忽略了一個(gè)事實(shí),就是在物理引擎中,碰撞檢測(cè)的工作并不是到找到哪
            些Shape相交就結(jié)束了。還有很多工作要做,我們要選取合適的碰撞點(diǎn),對(duì)每個(gè)碰撞點(diǎn)要得到法線,
            相交深度等信息。這些也在下節(jié)中繼續(xù)討論。
                    好了,現(xiàn)在我們得到了碰撞信息,兩種約束站在了同一起跑線上,讓我們回到約束求解這個(gè)
            核心問題上來吧。我們求解約束,所希望的結(jié)果是什么呢?簡(jiǎn)單的說是新的物理狀態(tài),速度,位移。
            你既可以先求出約束力,然后通過約束力更新這些狀態(tài),也可以直接算出這個(gè)約束所產(chǎn)生的沖量,直
            接施加于剛體。
                     對(duì)于每個(gè)約束,我們都能給出位移約束方程。比如說兩個(gè)質(zhì)點(diǎn)的距離固定,那么約束方程
            就是 (r1 - r2)Dot(r1 - r2) = L*L。當(dāng)然這個(gè)是最簡(jiǎn)單的情形,剛體的約束方程要比質(zhì)點(diǎn)復(fù)雜,而
            且各種不同的約束自然有各種不同的約束方程。而約束方程是求解的起點(diǎn),或者說直接或間接的,你
            都是通過約束方程和物理公式,算出了約束力或者沖量。而在各種求解的算法中,最關(guān)鍵的一個(gè)概念
            就是約束的雅可比(Jacobian),又叫雅可比矩陣。它的得出很簡(jiǎn)單,就是對(duì)約束方程求導(dǎo)。比如在上面
            例子中的約束方程,如果將這個(gè)方程對(duì)時(shí)間求導(dǎo),將會(huì)得到什么呢?一個(gè)速度方程。然后把這個(gè)方程
            中的速度V分離出來,并整理成矩陣相乘的形式:J*V=0,這樣得到的這個(gè)J矩陣就是這個(gè)約束的雅可比
            矩陣。以雅可比為基礎(chǔ),目前主要有兩種求解實(shí)現(xiàn),分別是PGS求解LCP,和Sequential-Impulse
            / Impulse-Based。同上面一樣,欲知具體算法如何,且聽下回分解。

            posted on 2008-01-09 17:44 楊粼波 閱讀(544) 評(píng)論(0)  編輯 收藏 引用


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


            久久精品成人国产午夜| 日韩精品久久久久久| 久久免费看黄a级毛片| 久久精品国产亚洲av水果派 | 久久人人妻人人爽人人爽| av午夜福利一片免费看久久 | 久久只有这里有精品4| 奇米综合四色77777久久| 99久久无色码中文字幕| 精品久久久久久久久免费影院| 97久久久精品综合88久久| 欧美精品丝袜久久久中文字幕 | 99久久精品国内| 久久国产AVJUST麻豆| 久久国产视屏| a级毛片无码兔费真人久久| 久久Av无码精品人妻系列| 欧美亚洲国产精品久久| 久久亚洲中文字幕精品一区| jizzjizz国产精品久久| 久久99国产综合精品女同| 久久久久亚洲Av无码专| 色综合久久综合中文综合网| 久久强奷乱码老熟女网站| 国产精品久久久香蕉| 中文字幕无码av激情不卡久久| 97久久精品人人做人人爽| 免费国产99久久久香蕉| 国内精品九九久久久精品| 久久综合狠狠综合久久| 久久精品黄AA片一区二区三区| 中文字幕久久久久人妻| 中文字幕无码免费久久| 日韩精品无码久久久久久| 亚洲伊人久久大香线蕉综合图片| 人人狠狠综合久久亚洲| 久久久久久极精品久久久| 欧美精品丝袜久久久中文字幕 | 国产亚洲精久久久久久无码AV| 国产亚洲色婷婷久久99精品91| 狠狠精品久久久无码中文字幕|