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


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

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


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


            久久亚洲精品国产精品婷婷| 国产精品伦理久久久久久| 精品人妻伦一二三区久久| 亚洲国产精久久久久久久| 激情久久久久久久久久| 一级A毛片免费观看久久精品| 久久天天躁夜夜躁狠狠躁2022| 久久99热这里只有精品66| 久久人人爽人人爽人人爽 | 女人高潮久久久叫人喷水| 久久天天躁狠狠躁夜夜2020一 | 国产精品久久久久无码av| 色播久久人人爽人人爽人人片aV| 伊人久久大香线蕉成人| 久久福利青草精品资源站| 久久精品无码一区二区三区日韩| 日本精品久久久久中文字幕| 久久婷婷五月综合97色直播| 97精品久久天干天天天按摩| 手机看片久久高清国产日韩| 成人久久久观看免费毛片| 久久无码中文字幕东京热| 久久精品中文字幕久久| 亚洲国产精品无码久久SM| 亚洲&#228;v永久无码精品天堂久久| 97久久精品无码一区二区| 色综合久久久久久久久五月| 国产高潮国产高潮久久久91 | 久久久久99精品成人片牛牛影视| 久久99国产乱子伦精品免费| 国产美女亚洲精品久久久综合| 久久精品中文字幕第23页| 久久综合综合久久97色| 精品久久久噜噜噜久久久| 亚洲乱码精品久久久久..| 色播久久人人爽人人爽人人片AV| 久久久精品久久久久影院| 日本加勒比久久精品| 久久久精品国产Sm最大网站| 久久露脸国产精品| 久久午夜综合久久|