英吋 C++

ODE – Chapter 6 《Rigid Body Functions》 Part I

Chapter 6 《Rigid Body Functions》

    6.1 Creating and Destroying Bodies
    
        dBodyID dBodyCreate (dWorldID);
        
        在指定的世界中創造剛體,並給予預設的mass和放置在座標(0, 0, 0)。回傳剛體的ID。

        void dBodyDestroy (dBodyID);

        摧毀剛體。所有附加在剛體上的關節都會被棄置(無附加目標和不影響模擬,但他們並沒有被刪除!)。


    6.2 Position and orientation

        void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z);
        void dBodySetRotation (dBodyID, const dMatrix3 R);
        void dBodySetQuaternion (dBodyID, const dQuaternion q);
        void dBodySetLinearVel (dBodyID, dReal x, dReal y, dReal z);
        void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z);
        const dReal * dBodyGetPosition (dBodyID);
        const dReal * dBodyGetRotation (dBodyID);
        const dReal * dBodyGetQuaternion (dBodyID);
        const dReal * dBodyGetLinearVel (dBodyID);
        const dReal * dBodyGetAngularVel (dBodyID);

        這些用來設定和取得剛體的位置、旋轉、直線速度和旋轉速度。在設定一個群組的剛體後,如果新的設定和關節或接觸點的設定不一致的話,模擬器會無法定義。
        取得時,方法會回傳內部資料結構的指標,所以可以合法的修改向量來改變剛體系統的結構。
        
        dBodyGetRotation 回傳的是 4×3 旋轉矩陣。

    6.3 Mass and force


        void dBodySetMass (dBodyID, const dMass *mass);

        void dBodyGetMass (dBodyID, dMass *mass);

        設定和取得剛體的質量(mass)。

        void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz);
        void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz);
        void dBodyAddRelForce (dBodyID, dReal fx, dReal fy, dReal fz);
        void dBodyAddRelTorque (dBodyID, dReal fx, dReal fy, dReal fz);
        void dBodyAddForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);
        void dBodyAddForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);
        void dBodyAddRelForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);
        void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);

        施加(絕對或相對座標的)力量給剛體。這些力量會累積在每個剛體上,在每次時間推進後就會歸零。
        …RelForce和..RelTorque方法所用到的力量向量都是相對於剛體自身的座標。
        …ForceAtPos和…ForceAtRelPos方法會使用到一個額外的座標向量(相對於世界或剛體的座標),它是用來定義力量會被施加的所在位置。其他所有的方法都是將力量施加在質量的中心點。

        const dReal * dBodyGetForce (dBodyID);
        const dReal * dBodyGetTorque (dBodyID);

        回傳目前所累積的力量和力矩向量。回傳的指標是由三個dReals組成的陣列。回傳值是指向內部的資料,所以可在剛體改變之前透過指標合法地修改。

        void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z);
        void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z);

        設定剛體的力量和力矩向量。通常用來將未啟用剛體的累積力量歸零,而後再啟用之。

    6.4 Utility

        void dBodyGetRelPointPos (dBodyID, dReal px, dReal py, dReal pz, dVector3 result);
        void dBodyGetRelPointVel (dBodyID, dReal px, dReal py, dReal pz, dVector3 result);
        void dBodyGetPointVel (dBodyID, dReal px, dReal py, dReal pz, dVector3 result);

        Utility方法會產生一個剛體上位置(px, py, pz)的指標,並將該指標的位置或速度,轉換成相對於世界座標的結果放在result裡面。dBodyGetRelPointXXX方法會給與相對於剛體座標的結果,dBodyGetPointVel則是相對於世界座標的結果。

        void dBodyGetPosRelPoint (dBodyID, dReal px, dReal py, dReal pz, dVector3 result);

        這是對應dBodyGetRelPointPos()。它會轉換一個世界的(px, py, pz)到相對於剛體的座標。

        void dBodyVectorToWorld (dBodyID, dReal px, dReal py, dReal pz, dVector3 result);
        void dBodyVectorFromWorld (dBodyID, dReal px, dReal py, dReal pz, dVector3 result);

        將剛體(世界)座標的向量轉換成世界(剛體)座標的向量放在result裡面。

    6.5 Automatic Enabling and Disabling

        每個剛體都可以決定是否要啟動自動關閉的功能。啟用的剛體會參與模擬,而關閉中的剛體會在模擬時忽略。新的剛體剛創造時通常都是啟用狀態。
        關閉的剛體可以透過關節和啟用中的鋼體連結,在下一次模擬推進時自動啟用。
        關閉的剛體不會消耗CPU時間,所以為了增進效能,應該在剛體靜止時關閉它。這可以透過設定自動關閉的選項來達成。
        當剛體自動關閉的功能被啟動時,它會在以下的狀況自動關閉:

            1. 在一定次數的推進中維持閒置狀態。
            2. 在一定模擬器時間中維持閒置狀態。

        剛體在直線速度和旋轉速度遠小於門檻值時,認定為閒置狀態。
        每個剛體有五種自動關閉的參數:啟用旗標(flag)、閒置推進步數門檻、閒置時間門檻、直線速度門檻和旋轉速度門檻。新創造的剛體會從世界給予這些參數。
        接下來是設定和取得剛體的參數(啟用/關閉)。

        void dBodyEnable (dBodyID);
        void dBodyDisable (dBodyID);

        手動啟用和關閉剛體。注意,當關閉中的剛體透過關節與啟用中的剛體連接,會在下一次推進時自動啟用。

        int dBodyIsEnabled (dBodyID);
        
        當鋼體式啟用時回傳1,不然回傳0。

        void dBodySetAutoDisableFlag (dBodyID, int do_auto_disable);
        int dBodyGetAutoDisableFlag (dBodyID);

        設定和取得剛體的自動關閉旗標。如果do_auto
_disable為非零,那麼當剛體閒置夠久,就會自動關閉。

        void dBodySetAutoDisableLinearThreshold (dBodyID, dReal linear_threshold);
        dReal dBodyGetAutoDisableLinearThreshold (dBodyID);

        設定和取得剛體自動關閉的直線速度門檻。剛體的直線速度遠小於這個門檻時,就認定為『閒置』。將門檻設為dInfinity則直接忽略直線速度的判定。

        void dBodySetAutoDisableAngularThreshold (dBodyID, dReal angular_threshold);
        dReal dBodyGetAutoDisableAngularThreshold (dBodyID);

        設定和取得剛體自動關閉的旋轉速度門檻。剛體的旋轉速度遠小於這個門檻時,就認定為『閒置』。將門檻設為dInfinity則直接忽略旋轉速度的判定。

        void dBodySetAutoDisableSteps (dBodyID, int steps);
        int dBodyGetAutoDisableSteps (dBodyID);

        設定和取得剛體自動關閉的推進次數門檻。將門檻設為0,則忽略判定閒置次數。

        void dBodySetAutoDisableTime (dBodyID, dReal time);
        dReal dBodyGetAutoDisableTime (dBodyID);

        設定和取得剛體自動關閉的時間門檻。將門檻設為0,則忽略判定閒置的時間。

        void dBodySetAutoDisableDefaults (dBodyID);

        將剛體的自動關閉參數設定成世界的預設值(新剛體的預設值)。

Next – Chapter 6 《Rigid Body Functions》 Part II

–Next

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.