1. 程式人生 > >Matter-JS Composites 混合材料 · 下

Matter-JS Composites 混合材料 · 下

目錄

Composites

car 汽車

newtonsCradle 牛頓擺


Composites

1、多個剛體通過約束組合在一起,稱為複合體。複合體對外當作一個剛體,複合體的物理屬性是通過所包含的剛體的屬性綜合計算出來的。

2、Matter.Composite 模組包含用於建立和處理複合體的方法。

3、Matter.Composites 模組提供了幾種特別的複合材料,如鏈:Composites.chain、牛頓擺:Composites.newtonsCradle、軟體:Composites.softBody、汽車:Composites.car 、堆疊:Composites.stack、網格:mesh、金字塔:pyramid。

4、Matter.Composites 模組提供了幾種特別的複合材料,如鏈:Composites.chain、牛頓擺:Composites.newtonsCradle、軟體:Composites.softBody、汽車:Composites.car 、堆疊:Composites.stack、網格:mesh、金字塔:pyramid

5、本文主要講解 

car 汽車

官網API:http://brm.io/matter-js/docs/classes/Composites.html#method_car

car 建立包含車身和約束的簡單汽車設定的組合。由一個矩形和兩個圓形構成,矩形作為汽車的主題,會對4個角進行圓角處理,兩個圓形作為輪子。

    /**
     * Creates a composite with simple car setup of bodies and constraints.
     * @param {number} xx          汽車中心點的x座標
     * @param {number} yy          汽車中心點的y座標
     * @param {number} width       汽車主體(矩形)的寬度
     * @param {number} height      汽車主體(矩形)的高度
     * @param {number} wheelSize   汽車輪子(圓形)的半徑
     * @return {composite} A new composite car body
     */
    Composites.car = function(xx, yy, width, height, wheelSize)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title>Matter-JS</title>
    <!--matter-js cdnjs地址-->
    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.12.0/matter.js"></script>-->
    <script src="../js/matter_0.14.2.js"></script>
    <script type="text/javascript">
        var stageWidth = 800;//舞臺寬度
        var stageHeight = 500;//舞臺高度
        window.onload = function () {
            var Engine = Matter.Engine;//引擎
            var Render = Matter.Render;//渲染器
            var World = Matter.World;//世界
            var Constraint = Matter.Constraint;//約束
            var MouseConstraint = Matter.MouseConstraint;//滑鼠控制
            var Composites = Matter.Composites;//複合材料
            var Bodies = Matter.Bodies;//物體

            var engine = Engine.create();//建立引擎
            var render = Render.create({//建立渲染器
                engine: engine,//渲染建立好的引擎
                element: document.body,//渲染頁面的body元素
                options: {
                    width: stageWidth,
                    height: stageHeight,
                    //wireframes: false,//是否顯示邊線框,預設false
                    showAngleIndicator: true,//是否顯示角度,預設false
                    showVelocity: true,//是否顯示速度,預設false
                    showCollisions: true//是否顯示碰撞點,預設false
                }
            });

            Engine.run(engine);//執行引擎
            Render.run(render);//執行渲染器

            /**設定滑鼠控制*/
            var mouseConstraint = MouseConstraint.create(engine, {});

            /**建立左側滑板————矩形。isStatic:固定物體;
             * angle:為物體設定傾斜角度,旋轉時以物體中心為軸,以順時針方向為正*/
            var board_left = Bodies.rectangle(200, 180, 400, 30, {
                isStatic: true,
                angle: Math.PI * (1 / 10.0)
            });
            /**建立右側滑板——與上同理*/
            var board_right = Bodies.rectangle(600, 300, 500, 30, {
                isStatic: true,
                angle: -Math.PI * (1 / 5.0)
            });

            /**Composites.car 建立汽車比較簡單,直接設定5個引數即可建立一個簡易的汽車
             * car(xx, yy, width, height, wheelSize)
             * (xx,yy)表示整個汽車中心的座標;width, height 表示汽車主體矩形的寬與高(不包括輪子)
             * wheelSize:汽車輪子(圓形)的半徑
             * */
            World.add(engine.world, [Composites.car(150, 100, 160, 30, 40)]);
            World.add(engine.world, [Composites.car(550, 200, 130, 20, 30)]);

            /**將兩塊固定的滑板,以及滑鼠控制新增到世界中*/
            World.add(engine.world, [board_left, board_right, mouseConstraint]);
            World.add(engine.world, create4Wall(Bodies));//為世界4周新增4面牆
        }
        /**
         *建立4面牆-強制物體在牆內運動
         */
        function create4Wall(Bodies) {
            var ground_top = Bodies.rectangle(stageWidth / 2, 0, stageWidth, 40, {isStatic: true});
            var ground_right = Bodies.rectangle(stageWidth, stageHeight / 2, 40, stageHeight, {isStatic: true});
            var ground_bottom = Bodies.rectangle(stageWidth / 2, stageHeight, stageWidth, 40, {isStatic: true});
            var ground_left = Bodies.rectangle(0, stageHeight / 2, 40, stageHeight, {isStatic: true});
            return [ground_top, ground_right, ground_bottom, ground_left];
        }
    </script>
</head>
<body>
</body>
</html>

提示:上面使用的是 matter.js 0.14.2 版本,親測 0.12.0 版本時樣式不是這樣的,而且當兩輛車重疊時會有明顯的抖動。

官網Demo:http://brm.io/matter-js/demo/#car

newtonsCradle 牛頓擺

官網API:http://brm.io/matter-js/docs/classes/Composites.html#method_newtonsCradle

newtonsCradle 方法原始碼如下,依次建立 number 個圓形,然後對圓形附加約束掛在約束點上。

    /**
     * Creates a composite with a Newton's Cradle setup of bodies and constraints.
     * @method newtonsCradle
     * @param {number} xx       第一個擺的懸掛點的x座標
     * @param {number} yy       第一個擺的懸掛點的y座標
     * @param {number} number   擺的總個數
     * @param {number} size     擺球的半徑
     * @param {number} length   擺的懸掛點到擺球圓形的距離,即繩子的長度
     * @return {composite} A new composite newtonsCradle body
     */
    Composites.newtonsCradle = function(xx, yy, number, size, length) {
        var newtonsCradle = Composite.create({ label: 'Newtons Cradle' });
        for (var i = 0; i < number; i++) {
            var separation = 1.9,
                circle = Bodies.circle(xx + i * (size * separation), yy + length, size, 
                            { inertia: Infinity, restitution: 1, friction: 0, frictionAir: 0.0001, slop: 1 }),
                constraint = Constraint.create({ pointA: { x: xx + i * (size * separation), y: yy }, bodyB: circle });
            Composite.addBody(newtonsCradle, circle);
            Composite.addConstraint(newtonsCradle, constraint);
        }
        return newtonsCradle;
    };

使用示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title>Matter-JS</title>
    <!--matter-js cdnjs地址-->
    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.12.0/matter.js"></script>-->
    <script src="../js/matter_0.14.2.js"></script>
    <script type="text/javascript">
        var stageWidth = 800;//舞臺寬度
        var stageHeight = 500;//舞臺高度
        window.onload = function () {
            var Engine = Matter.Engine;//引擎
            var Render = Matter.Render;//渲染器
            var World = Matter.World;//世界
            var Constraint = Matter.Constraint;//約束
            var MouseConstraint = Matter.MouseConstraint;//滑鼠控制
            var Composites = Matter.Composites;//複合材料
            var Bodies = Matter.Bodies;//物體

            var engine = Engine.create();//建立引擎
            var render = Render.create({//建立渲染器
                engine: engine,//渲染建立好的引擎
                element: document.body,//渲染頁面的body元素
                options: {
                    width: stageWidth,
                    height: stageHeight,
                    //wireframes: false,//是否顯示邊線框,預設false
                    showAngleIndicator: true,//是否顯示角度,預設false
                    showVelocity: true,//是否顯示速度,預設false
                    showCollisions: true//是否顯示碰撞點,預設false
                }
            });

            Engine.run(engine);//執行引擎
            Render.run(render);//執行渲染器

            /**設定滑鼠控制*/
            var mouseConstraint = MouseConstraint.create(engine, {});

            /**建立牛頓擺——使用比較簡單
             * 200, 25, 5, 40, 150:第一個擺懸掛點位置為(200,25)、一個5個擺球,擺球半徑40,繩子長度150
             * 200, 250, 8, 25, 150:第一個擺懸掛點位置為(200,250)、一個8個擺球,擺球半徑25,繩子長度150
             * */
            var newtonsCradle_1 = Composites.newtonsCradle(200, 25, 5, 40, 150);
            var newtonsCradle_2 = Composites.newtonsCradle(200, 250, 8, 25, 150);

            /**Matter.Body.translate(body, translation)——對 body(物體)進行translation(轉換)
             * {x: -100, y: -30}:對第1個牛頓擺中的第一個擺往左偏移100,往上偏移30
             * {x: 180, y: 10}:對第2個牛頓擺中的第8個擺往右偏移180,往上偏移50
             */
            Matter.Body.translate(newtonsCradle_1.bodies[0], {x: -100, y: -30});
            Matter.Body.translate(newtonsCradle_2.bodies[7], {x: 180, y: -50});

            World.add(engine.world, [newtonsCradle_1, newtonsCradle_2, mouseConstraint]);
            World.add(engine.world, create4Wall(Bodies));//為世界4周新增4面牆
        }
        /**
         *建立4面牆-強制物體在牆內運動
         */
        function create4Wall(Bodies) {
            var ground_top = Bodies.rectangle(stageWidth / 2, 0, stageWidth, 40, {isStatic: true});
            var ground_right = Bodies.rectangle(stageWidth, stageHeight / 2, 40, stageHeight, {isStatic: true});
            var ground_bottom = Bodies.rectangle(stageWidth / 2, stageHeight, stageWidth, 40, {isStatic: true});
            var ground_left = Bodies.rectangle(0, stageHeight / 2, 40, stageHeight, {isStatic: true});
            return [ground_top, ground_right, ground_bottom, ground_left];
        }
    </script>
</head>
<body>
</body>
</html>

官網demo:http://brm.io/matter-js/demo/#newtonsCradle