日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接触力的计算

發(fā)布時間:2024/3/12 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接触力的计算 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  游戲或者仿真中要提供接近于真實世界的完整觸覺反饋體驗,需要VR頭戴設備、控制器、外骨骼甚至是行走模擬裝置的配合。然而,人類的觸覺系統(tǒng)極其敏感,普通人打麻將就能用手指輕輕松松地摸出牌面。在目前的技術基礎上,機器很難還原真實的人類觸覺反饋,能做的只是在特定的內容和場景中盡量滿足用戶的反饋體驗。比如在VR游戲中抓取武器和物品時,幾厘米的偏差,沒有準確還原物體材質和紋路,對用戶的實際體驗影響并不大。除了高精度的外設,要實現(xiàn)觸覺或力反饋,還需要強大的物理引擎,虛擬世界中的復雜物體的建模、與用戶肢體的觸碰非常消耗計算資源。

[Using a two arms exoskeleton while wearing a VR head-mounted display creating an immersed environment]?

  • 牛頓運動定律與物理引擎
  • 慣性定律:如果物體沒有受到外力作用,則運動狀態(tài)(靜止或勻速直線運動)不會發(fā)生改變;
  • 牛頓第二定律:物體的加速度跟其所受合外力成正比,跟物體質量成反比,加速度方向與合外力方向相同,即$F=ma$;
  • 牛頓第三定律:力是物體與物體之間的相互作用,作用力與反作用力總是大小相等方向相反,作用在同一直線上。
  •   根據(jù)牛頓三大運動定律,我們可以創(chuàng)造物理引擎來使虛擬場景中的物體產生動態(tài)行為,提供沉浸式體驗。對于一個交互式游戲來說其基本運行流程如下:

      計算物體間的碰撞是物理引擎最核心的部分。一般來說,先要解決如何高效地檢測到碰撞的產生(碰撞檢測),以及如何確定碰撞點及方向,之后我們就可以求得碰撞體的受力情況,從而根據(jù)牛頓運動定律計算出它們將要產生的平動和轉動。最后將場景中物體的位置和姿態(tài)輸出給圖形引擎去渲染。

      但如何求得力和力矩?這便是一個很復雜的問題了。像重力可以直接影響物體所受力,摩擦可以直接影響物體所受力矩,這些都很簡單。較為復雜的就是兩個物體間的碰撞了,物體引擎中有一半以上的代碼是用來計算碰撞的。

      在兩物體接觸面上存在著接觸面法向力(沖擊力或接觸力)和接觸面切向力(摩擦力)兩種作用。當接觸不連續(xù)時產生的接觸法向力就是沖擊力。由于摩擦力本身也是很復雜的問題,很多仿真軟件中對它作了簡化,采用比較簡單的庫倫摩擦力模型來計算:$$F_f=\mu F_n$$

    ?

    • 用于碰撞的動力學基本定理

      由于碰撞時間極短,通常只有千分之一甚至萬分之一秒,因此所產生的力非常巨大。這種產生在碰撞中,作用時間極短,數(shù)值巨大的力稱為碰撞力瞬時力。瞬時力的沖量稱之為碰撞沖量。瞬時力不僅數(shù)值巨大,而且隨時間迅速變化,其規(guī)律非常復雜,難以確定。碰撞過程中除了由碰撞力引起物體塑性變形外,同時還伴隨著發(fā)聲、發(fā)光和發(fā)熱等機械能轉換為其它形式能量的現(xiàn)象。因此,在研究碰撞問題時,一般并不去討論瞬時力本身,而只討論它的沖量及產生的總效果。研究碰撞問題,各微分形式的動力學基本定理不能直接應用,一般用積分形式的動量定理和動量矩定理。

      當兩物體碰撞時,過接觸點作物體表面的公法線,此法線稱為碰撞法線。若兩物體的質心均位于碰撞接觸點的公法線上,則為對心碰撞;否則為偏心碰撞。?

      1. ?沖量定理

      對于由$n$個質點組成的質點系,其中第$i$個質點受到的碰撞沖量可分為外碰撞沖量$\bf?I_i^{(e)}$和內碰撞沖量$\bf?I_i^{(i)}$,由于內碰撞沖量大小相等方向相反,則質點系在碰撞開始和結束時的動量的改變等于作用于質點系的外碰撞沖量的矢量和:$$? m{\bf u_c} - ?m \bf v_c=\sum I_i^{(e)}$$

      其中,$m$為質點系質量,$\bf v_c$和$\bf u_c$分別為質心碰撞開始和結束時的速度。

      2. ?沖量矩定理

      質點系對質心的動量矩的改變等于外碰撞沖量對質心矩的矢量和:$$ \bf L_{c2}-L_{c1}=\sum M_c (I_i^{(e)})$$

      式中,$\bf L_{c1}$和$\bf L_{c2}$分別表示碰撞開始和結束時質點系對質心的動量矩矢;$\sum M_c (I_i^{(e)})$為外碰撞沖量對質心之矩的矢量和。

      對于平面運動剛體的碰撞問題,可應用質點系相對于質心的沖量矩定理來描述轉動部分。根據(jù)剛體平面運動特征,相對于質心的沖量矩定理在其平面內視為代數(shù)量,即有$$L_c=J_c \omega$$

      式子中$J_c$為剛體對過質心且與其對稱平面垂直的軸的轉動慣量,$\omega$為剛體轉動的角度。由沖量矩定理有:$$L_{c2}-L_{c1}=J_c \omega_2-J_c \omega_1=\sum M_c (I_i^{(e)})$$

      式中,$\omega_1$和$\omega_2$分別為平面運動剛體碰撞前、后的角速度。

    • ?恢復系數(shù)

      碰撞過程可分為兩個階段。開始碰撞到物體速度為零的過程為第一階段,稱為變形階段。碰撞沖量為$\bf I_1$,則根據(jù)沖量定理:$$0-(-mv)=\it I_1$$

      之后,物體恢復彈性變形到碰撞結束的過程為第二階段,稱為變形恢復階段。設碰撞沖量為$\bf I_2$,則根據(jù)沖量定理:$$mu-0=\it I_2$$

    ?  經(jīng)研究發(fā)現(xiàn),對于材料確定的物體發(fā)生正碰撞時,碰撞前后的速度大小之比幾乎是不變的,等于一個常數(shù)$e$,即$$e=\frac{u}{v}=\frac{I_2}{I_1}$$

    ?  $e$稱為恢復系數(shù)。恢復系數(shù)$e$表示物體在碰撞前后速度的恢復程度和物體變形的恢復程度,也反映了碰撞中機械能損失的程度。$e$越小,動能損失越大;反之,動能損失越小。一般情況下,$u<v$,恢復系數(shù)小于1。但理論上,恢復系數(shù)也可以大于1。例如當兩個手雷碰撞在一起產生爆炸,化學能轉換為機械能(能量增加),碰撞后的速度大于碰撞前速度。另外需要注意:恢復系數(shù)是兩個碰撞物體之間的共同性質,但在許多文獻中恢復系數(shù)常寫為單個物體固有屬性(沒有提這物體到底是與哪個物體相互碰撞),在這種情況下,第二個物體被假定為完全彈性剛體。

    • ?ADAMS中的沖擊力模型

      We can either use information about the depth of the collision and generate a very large force acting on the two objects (like a very stiff spring due to the “compression” of the object’s material as one penetrates the other), or we can use an impulse response which means we simply modify the objects’ momentum without any regard for the forces involved.

      ADAMS中計算法向接觸力大小有兩種模型:沖擊函數(shù)模型(Impact)和恢復系數(shù)模型(Restitution)。恢復系數(shù)模型基于沖量理論。沖擊函數(shù)模型用一個彈簧-阻尼模型來表示(碰撞力由兩個部分組成:一個是由于兩個構件之間的相互切入而產生的彈性力;另一個是由于相對速度產生的阻尼力),沖擊函數(shù)表示為:$$F_n=k\cdot g^e+step(g,0,0,d_{max},c_{max}) \cdot\frac{dg}{dt}$$

    ?  式中:$g$——接觸物體之間的穿透深度;$F_n$——法向接觸力大小;$k$——剛度系數(shù);$e$——碰撞系數(shù),反映了材料的非線性程度;$c_{max}$——最大阻尼系數(shù),表示物體碰撞時的能量損失;$d_{max}$——最大切入深度,它決定了何時阻尼力達到最大;為了防止碰撞過程中阻尼力的不連續(xù),式中采用了step函數(shù),其形式為$step(x,x_0,h_0,x_1,h_1)$

    [Damping Coefficient versus Penetration]

    • ?VREP中獲取接觸力的方法

    ?  機器人仿真中常常需要測量腳底壓力分布,或是手爪夾持力等接觸力。在VREP中獲取接觸力有兩種方法:一種是通過在末端添加力傳感器進行測量,另一種是直接利用物理引擎計算結果獲取接觸力信息,相關函數(shù)為simGetContactInfo:

      使用simGetContactInfo函數(shù)可以直接獲取接觸力信息,不用添加力傳感器等物體,但是用法稍微復雜。VREP中默認情況下物理引擎運行速度是仿真速度的10倍,就是說如果仿真一步需要50ms,那么物理引擎已經(jīng)運算了10步(5ms一步),如果dynamicPass參數(shù)設為sim_handle_all,則一步仿真將會返回10次接觸力的結果。如果要利用接觸力的信息,需要解析這些力屬于哪兩個接觸體。參考官方論壇中的帖子Get Friction between leg-tip and ground:

    ?Is it possible to detect the friction between the tip of a robot-leg and the ground?

    ?You have several ways of doing this:

    • you can attach a force sensor at the tip of your leg, then attach a contact sphere to the force sensor (i.e. legTip --> forceSensor --> contactSphere). Then you can read the force/torque in the force/torque sensor
    • you can parse all contact points and vectors for one simulation step and try to figure out which one(s) correspond to a specific leg/ground pair. This is more complicated, but you do not require an additional contact sphere as in above's first point. For that, have a look at the demo model Models/other/contact display.ttm (which uses the API function simGetContactInfo)

    ?  VREP中提供了一個contact display模型(Model browser --> other文件夾下),利用simGetContactInfo函數(shù)方便的為用戶顯示接觸點和接觸力的大小以及方向。修改其lua代碼,在狀態(tài)欄中顯示每次獲取的接觸力信息。從圖中可以看出立方體與地面接觸點有4個,將這些接觸點對應的接觸力加起來就是立方體重量。

      核心代碼是下面這句,返回值objectsInContact是相互接觸兩物體的句柄,contactPt是接觸點的三維坐標,forceDirectionAndAmplitude是力向量的三維坐標,幅值代表大小:

    objectsInContact,contactPt,forceDirectionAndAmplitude = simGetContactInfo(sim_handle_all, sim_handle_all, index)

      仿真時可以看到四個點的接觸力數(shù)值是一直在跳動的(理論上如果接觸面是平面,四個點接觸力應該一樣),也許是三點確定一個平面,多一個冗余的接觸點就會導致計算不穩(wěn)定?下圖中的球與地面只有一個接觸點,仿真時的接觸力要穩(wěn)定許多。而且接觸力的仿真結果還與具體的物理引擎有關,Bullet和ODE的結果就比Vortex和Newton差很多...

      為了得到穩(wěn)定可靠地接觸力,可以對一次仿真中的所有接觸力求平均值(參考官方論壇帖子Impact force on collision),下面修改了contact display中的代碼,將每一步獲取的力(對于單個立方體與地面接觸模型,每一步仿真共有40個接觸點的接觸力)求均值,計算立方體重量:

    if (sim_call_type==sim_childscriptcall_initialization) then black={0,0,0}purple={1,0,1}lightBlue={0,1,1}options=0forceVectorScaling=simGetScriptSimulationParameter(sim_handle_self,'forceVectorScaling')forceVectorWidth=simGetScriptSimulationParameter(sim_handle_self,'forceVectorWidth')contactPointSize=simGetScriptSimulationParameter(sim_handle_self,'contactPointSize')overlayDisplay=simGetScriptSimulationParameter(sim_handle_self,'overlayDisplay')--sim_drawing_overlay: if specified, then items are drawn on top of other objects and are (almost) always visibleif (overlayDisplay) thenoptions=options+sim_drawing_overlayend-- Add a line and a sphere container:--sim_drawing_lines:items are pixel-sized lines. 6 values per item (x0,y0,z0,x1,y1,z1) lineContainer = simAddDrawingObject(sim_drawing_lines+options,forceVectorWidth,0,-1,1000,black,black,black,purple)--items are "sphere points". 3 values per item (x,y,z) sphereContainer = simAddDrawingObject(sim_drawing_spherepoints+options,contactPointSize,0,-1,1000,black,black,black,lightBlue)ObjectHandle = simGetObjectHandle("Cuboid") end if (sim_call_type==sim_childscriptcall_cleanup) then -- Remove the containers: simRemoveDrawingObject(lineContainer)simRemoveDrawingObject(sphereContainer) end if (sim_call_type==sim_childscriptcall_sensing) then -- empty the containers:simAddDrawingObjectItem(lineContainer,nil) simAddDrawingObjectItem(sphereContainer,nil) -- Fill the containers with contact information:index = 0 -- zero-based index of the contact to retrievesum = 0while (true) do-- Retrieves contact point information of a dynamic simulation passobjectsInContact,contactPt,forceDirectionAndAmplitude = simGetContactInfo(sim_handle_all, ObjectHandle, index)if (objectsInContact) thensum = sum + forceDirectionAndAmplitude[3]if (index == 39) thenstr = string.format("%f N", sum/10)simAddStatusbarMessage(str) -- Adds a message to the status barendline={contactPt[1],contactPt[2],contactPt[3], 0,0,0}line[4]=contactPt[1]+forceDirectionAndAmplitude[1]*forceVectorScalingline[5]=contactPt[2]+forceDirectionAndAmplitude[2]*forceVectorScalingline[6]=contactPt[3]+forceDirectionAndAmplitude[3]*forceVectorScalingsimAddDrawingObjectItem(lineContainer,line) -- Draw force vectorsimAddDrawingObjectItem(sphereContainer,{contactPt[1],contactPt[2],contactPt[3]}) -- Draw contact point index = index + 1elsebreakendend end View Code

      代碼中還涉及到了腳本仿真參數(shù),通過設置仿真參數(shù)可以方便地修改控制腳本中的某些變量,比如線的寬度,接觸點大小,比例因子等等。The?main script?and each?child script?have a list of simulation parameters. Those parameters can be used as a quick way of adjusting values of a specific?model. 在腳本文件中可以通過simGetScriptSimulationParameter函數(shù)來獲取用戶輸入的參數(shù)。仿真參數(shù)圖標位于腳本圖標右側,如下圖所示分別是沒有定義和定義了仿真參數(shù)的圖標樣式:

    [Script simulation parameter icons (1) empty parameter list, (2) non-empty parameter list]

    ?  雙擊仿真參數(shù)圖標可以打開參數(shù)設置對話框,點擊Add new parameter按鈕可以插入新的仿真參數(shù)。Value處輸入?yún)?shù)的值,Unit為參數(shù)單位(這里只起到提示作用)

    [Script simulation parameters dialog]

    • Parameter is private: if enabled, then the selected parameter is not shown during a simulation (in that case the parameter is probably not meant to be modified during a simulation).
    • Parameter is persistent: if enabled, then the selected parameter will not be restored to its original value at simulation end.

      獲取仿真參數(shù)的函數(shù)simGetScriptSimulationParameter原型如下:

    boolean/number/string parameterValue=simGetScriptSimulationParameter(number scriptHandle,string parameterName,boolean forceStringReturn=false)

      函數(shù)參數(shù)scriptHandle為腳本句柄,或取值sim_handle_main_script或sim_handle_self;參數(shù)parameterName為仿真參數(shù)名(取值為腳本參數(shù)對話框中插入的參數(shù)名);參數(shù)forceStringReturn默認為false,該參數(shù)用于指定是否將仿真參數(shù)值當作字符串。比如,如果該參數(shù)設為true,則contactPointSize的值0.01會被函數(shù)返回為string類型,即"0.01",而非number類型。

    ?  下面是一個斜面接觸的例子,如下圖所示質量為1Kg的立方體由于靜摩擦力在30°斜面上保持靜止,可以看出下方兩個接觸點的接觸力要明顯大于上方的兩個(不像與水平面接觸時那樣均勻)。計算四個點接觸力矢量的幅值并相加可以求得立方體與斜面接觸力的大小,理論上這個力為mgcos30°≈8.66N,實際仿真時輸出的結果與理論值一致:

    if (sim_call_type==sim_childscriptcall_initialization) then black={0,0,0}purple={1,0,1}lightBlue={0,1,1}options=0forceVectorScaling=simGetScriptSimulationParameter(sim_handle_self,'forceVectorScaling')forceVectorWidth=simGetScriptSimulationParameter(sim_handle_self,'forceVectorWidth')contactPointSize=simGetScriptSimulationParameter(sim_handle_self,'contactPointSize')overlayDisplay=simGetScriptSimulationParameter(sim_handle_self,'overlayDisplay')if (overlayDisplay) thenoptions=options+sim_drawing_overlayend-- Add a line and a sphere container:lineContainer=simAddDrawingObject(sim_drawing_lines+options,forceVectorWidth,0,-1,1000,black,black,black,purple)sphereContainer=simAddDrawingObject(sim_drawing_spherepoints+options,contactPointSize,0,-1,1000,black,black,black,lightBlue)ObjectHandle = simGetObjectHandle("cube")end if (sim_call_type==sim_childscriptcall_cleanup) then -- Remove the containers: simRemoveDrawingObject(lineContainer)simRemoveDrawingObject(sphereContainer) end if (sim_call_type==sim_childscriptcall_sensing) then -- empty the containers:simAddDrawingObjectItem(lineContainer,nil) simAddDrawingObjectItem(sphereContainer,nil) -- Fill the containers with contact information:index=0sum = 0while (true) doobjectsInContact,contactPt,forceDirectionAndAmplitude=simGetContactInfo(sim_handle_all,ObjectHandle,index)if (objectsInContact) thensum = sum + math.sqrt(forceDirectionAndAmplitude[1]*forceDirectionAndAmplitude[1]+forceDirectionAndAmplitude[2]*forceDirectionAndAmplitude[2]+forceDirectionAndAmplitude[3]*forceDirectionAndAmplitude[3])if (index == 39) thenstr = string.format("%f N", sum/10)simAddStatusbarMessage(str) -- Adds a message to the status barendline={contactPt[1],contactPt[2],contactPt[3],0,0,0}line[4]=contactPt[1]+forceDirectionAndAmplitude[1]*forceVectorScalingline[5]=contactPt[2]+forceDirectionAndAmplitude[2]*forceVectorScalingline[6]=contactPt[3]+forceDirectionAndAmplitude[3]*forceVectorScalingsimAddDrawingObjectItem(lineContainer,line)line[4]=contactPt[1]-forceDirectionAndAmplitude[1]*forceVectorScalingline[5]=contactPt[2]-forceDirectionAndAmplitude[2]*forceVectorScalingline[6]=contactPt[3]-forceDirectionAndAmplitude[3]*forceVectorScalingsimAddDrawingObjectItem(lineContainer,line)simAddDrawingObjectItem(sphereContainer,line)index=index+1elsebreakendend end View Code

    ?

      再看看接觸力動態(tài)變化的例子。在場景中添加一個球體,拖離地面,然后雙擊其圖標打開Dynamic屬性對話框。點擊"Edit material"按鈕,在對應的物理引擎下修改材料屬性。仿真時使用的是Bullet V2.78,這里修改了恢復參數(shù)(值越大材料彈性越大)和摩擦參數(shù)。注意,當計算兩個物體之間的摩擦時,必須聯(lián)合二者的摩擦參數(shù)(Two colliding objects will have a combined friction value of value1*value2. This does not correspond to the real friction coefficient)。恢復值通常設置在0到1之間,0意味著小球落地不會彈起,即非彈性碰撞(塑性碰撞,碰撞結束時物體變形無任何恢復,動能全部消耗在碰撞過程中),1為完全彈性碰撞。恢復系數(shù)一般由實驗方法確定,工程中材料的恢復系數(shù)可以在工程手冊中查到。(Higher?restitution?values tend to make collisions appear elastic. This does not correspond to the real restitution coefficient. )

      拖入contact display模型顯示接觸力,開始仿真。小球從一定高度自由落下,碰到地面后反彈幾次,最后靜止,下面的動圖可以看出接觸力的變化:

      下面一個例子中機械臂末端執(zhí)行器上裝有力傳感器,用于測量機械手托舉重物的重量。兩個關節(jié)采用PID控制使機械臂保持在水平位置,單擊自定義界面上的Add weight按鈕會添加新的重物,對應傳感器測得的重量和關節(jié)保持力矩都會增大。另外也直接使用了simGetContactInfo函數(shù)獲取接觸力信息并在狀態(tài)欄輸出,從下圖可以看到隨著重物的增加接觸力逐漸變大:

    Custom UI:

    function buttonClick(ui, id)NewObjectHandle = simCreatePureShape(0, 10 , {0.1,0.1,0.1}, 1)simSetObjectPosition(NewObjectHandle, LastHandle, {0,0,0.2})LastHandle = NewObjectHandle endif (sim_call_type==sim_childscriptcall_initialization) thenInitialObjectHandle = simGetObjectHandle('Cuboid')LastHandle = InitialObjectHandlexml = [[ <ui> <button text="Add weight" οnclick='buttonClick'/> </ui> ]]ui=simExtCustomUI_create(xml) endif (sim_call_type==sim_childscriptcall_actuation) then endif (sim_call_type==sim_childscriptcall_sensing) thenendif (sim_call_type==sim_childscriptcall_cleanup) thensimExtCustomUI_destroy(ui) end View Code

    ContactInfoDIsplay:

    if (sim_call_type==sim_childscriptcall_initialization) then black={0,0,0}purple={1,0,1}lightBlue={0,1,1}options=0forceVectorScaling=simGetScriptSimulationParameter(sim_handle_self,'forceVectorScaling')forceVectorWidth=simGetScriptSimulationParameter(sim_handle_self,'forceVectorWidth')contactPointSize=simGetScriptSimulationParameter(sim_handle_self,'contactPointSize')overlayDisplay=simGetScriptSimulationParameter(sim_handle_self,'overlayDisplay')if (overlayDisplay) thenoptions=options+sim_drawing_overlayend-- Add a line and a sphere container:lineContainer=simAddDrawingObject(sim_drawing_lines+options,forceVectorWidth,0,-1,1000,black,black,black,purple)sphereContainer=simAddDrawingObject(sim_drawing_spherepoints+options,contactPointSize,0,-1,1000,black,black,black,lightBlue)ObjectHandle = simGetObjectHandle("Pad") end if (sim_call_type==sim_childscriptcall_cleanup) then -- Remove the containers: simRemoveDrawingObject(lineContainer)simRemoveDrawingObject(sphereContainer) end if (sim_call_type==sim_childscriptcall_sensing) then -- empty the containers:simAddDrawingObjectItem(lineContainer,nil) simAddDrawingObjectItem(sphereContainer,nil) -- Fill the containers with contact information:index=0sum = 0while (true) doobjectsInContact,contactPt,forceDirectionAndAmplitude=simGetContactInfo(sim_handle_all,ObjectHandle,index)if (objectsInContact) thensum = sum + forceDirectionAndAmplitude[3]if (index == 39) thenstr = string.format("%f N", sum/10)simAddStatusbarMessage(str) -- Adds a message to the status barendline={contactPt[1],contactPt[2],contactPt[3],0,0,0}line[4]=contactPt[1]-forceDirectionAndAmplitude[1]*forceVectorScalingline[5]=contactPt[2]-forceDirectionAndAmplitude[2]*forceVectorScalingline[6]=contactPt[3]-forceDirectionAndAmplitude[3]*forceVectorScalingsimAddDrawingObjectItem(lineContainer,line)simAddDrawingObjectItem(sphereContainer,line)index=index+1elsebreakendend end View Code

    ?

    ?

    參考:

    Video Game Physics Tutorial - Part III: Constrained Rigid Body Simulation

    Game Physics Series

    How Physics Engines Work

    為JavaScript游戲構建一個簡單的 2D 物理引擎

    Box2D:基礎知識

    關于實時物理引擎的點滴

    V-REP Forum:contact point

    零基礎制作物理引擎——創(chuàng)造力量

    制作簡單的2D物理引擎(一)——動力學基礎

    物理引擎在游戲中的應用

    BulletPhysic: contacts force/impulse

    總結

    以上是生活随笔為你收集整理的接触力的计算的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。