CG仿真及3D特效編程教程(四)| 碰撞規(guī)避及碰撞檢測
回顧
上一期內容是關于粒子系統(tǒng)的創(chuàng)建和一些例子,內容相對簡單和容易理解。這一期虹圖美顏SDK會介紹碰撞相關內容,也會是很復雜的一期內容,堅持住最后一期了,學完這一期就能夠對CG仿真這部分有初步的理解和應用,后續(xù)可以用于圖形學,也可以用于游戲編程等方面。
碰撞規(guī)避
首先碰撞規(guī)避和碰撞檢測是有區(qū)別的,碰撞檢測指的是讓物體碰撞后互相反彈開,碰撞規(guī)避指的是讓物體改變運動路徑從而不發(fā)生第一次碰撞。
那么如何來規(guī)避碰撞呢?
想一下彈簧的工作原理。

D0是彈簧壓縮后的長度,向上的力F = ma = -k(x – D0),k是彈簧的彈性系數(shù)(N/m或lb/in)?;蛘吒鶕?jù)牛頓第二定律得出的微分方程,mx’’(t)+cx‘(t)+kx(t)=0。
在避免碰撞過程中,我們加入一個假想的彈簧力學系統(tǒng),去避免物體與物體之間的碰撞。

我們改寫下微分方程:

其中m是質量,c是阻尼,k是彈性系數(shù)。
怎么得出來的?那我們來看下:

那么怎么才能讓物體遠離物體,那就要引入排斥力。

從而實現(xiàn)物體到達目標位置過程中不會和其他物體發(fā)生碰撞。
碰撞檢測
在檢測碰撞時,有兩種不同的類型,離散的和連續(xù)的。離散的就是比較A物體所有的邊和B物體所有的面。連續(xù)的就是連接不同時段同一物體的所有點,形成虛擬的邊,然后和B物體所有的面比較。

那么怎么判定兩個物體相交呢?首先先把物體形成表面球體:


當然這只是其中一種方法。也可以使用邊界框檢測,總的來說就是改變物體的表達方法,以提高碰撞檢測效率。
最后放一些對大家有用的資源鏈接吧:
OpenGL:
Industry-wide OpenGL Information:?http://www.opengl.org
OpenGL 4.6 Reference Card opengl46-quick-reference-card.pdf
OpenGL specifications:?http://www.opengl.org/documentation/specs
OpenGL Man Pages:?http://www.opengl.org/sdk/docs/man
OpenGL SDK:?http://www.opengl.org/sdk
OpenGL Tutorials:?http://www.lighthouse3d.com/opengl/tutorials.shtml
The GLUT Library:
GLUTDocumentation:?https://www.opengl.org/resources/libraries/glut/spec3/spec3.html
PDFGLUTDocumentation:?https://www.opengl.org/resources/libraries/glut/glut-3.spec.pdf
當然對于彈簧系統(tǒng)在碰撞當中的應用其實還有很多,也有一些碰撞避免的示例代碼,如果有興趣深入了解這塊問題,我們可以在開發(fā)者社區(qū)見。本期教程到這里就結束,后續(xù)我們還會不定期放出一些其他教程,如果開發(fā)者對于教程類型有好的建議,也可以留言,希望本期教程能夠讓大家了解一些CG仿真的知識。
最后,關于使用了大量AI+圖形學技術的虹圖AI人像人體特效的美顏SDK,3D Avatar SDK等產(chǎn)品,大家可以查看官網(wǎng)了解更多信息。