PhysicsJS 物理引擎一些基本操作

1 篇文章 0 订阅
1 篇文章 0 订阅

增加图形界面示例操作:

一个html页面做多个功能示例展示时,进行切换和单独的操作界面控制 .例如上面的控制界面是采用dat.gui库,examples有很N个,每个切换的时候会有自己的操作界面.这里不细说了推荐大家自己去看一下dat.gui.js。

 <script src="https://cdn.jsdelivr.net/npm/physicsjs@0.7.0/dist/physicsjs-full.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.js"
        integrity="sha256-B2A44YCanY9zaHL5nwcihGM3GiWpOE4md3COMTdAggM=" crossorigin="anonymous"></script>
    <script
        src="https://rawcdn.githack.com/fanyonglong/DxFrameworks/526f72d6673b25b1a3da245cac2284a89fec342c/utility/exampleTool.js"></script>


 var exmapleInstance = ExampleFactory(function (exmaple) {
            exmaple.addOperation('暂停', function () {
                Physics.util.ticker.stop();
            });
            exmaple.addOperation('恢复', function () {
                Physics.util.ticker.start()
            });
            return function (page) {
                page.onChange('init', function () {

                });
                page.onChange('show', function () {
                    world.unpause()
                });
                page.onChange('hide', function () {
                    world.pause()
                });
                page.onChange('refresh', function () {

                });

                // 添加公共操作属性
                page.addColor('color', '#ff0');

                var world = Physics({
                    // default timestep
                    timestep: 6,
                    // maximum number of iterations per step
                    maxIPF: 4,

                    // default integrator
                    integrator: 'verlet',

                    // is sleeping disabled?
                    sleepDisabled: false,
                    // speed at which bodies wake up
                    sleepSpeedLimit: 0.1,
                    // variance in position below which bodies fall asleep
                    sleepVarianceLimit: 2,
                    // time (ms) before sleepy bodies fall asleep
                    sleepTimeLimit: 500
                });
                var _renderer = addRenderer(world, function (el) {
                    page.el.appendChild(el);
                });
                page.callback({ renderer: _renderer, world: world }, page)
                // world.render();

                world.on('step', function (time) {
                    //  ball.state.pos.add(0.1,0)
                    world.render();
                    //  _renderer.draw(thing);
                })

                Physics.util.ticker.on(function (time) {
                    world.step(time);
                });
                Physics.util.ticker.start();
            }


        });
//`var ${Object.keys(Physics).map(d=>`${d}=Physics.${d}`).join(',\n')};`
        var util = Physics.util,
            aabb = Physics.aabb,
            gjk = Physics.gjk,
            statistics = Physics.statistics,
            transform = Physics.transform,
            vector = Physics.vector,
            noConflict = Physics.noConflict,
            scratchpad = Physics.scratchpad,
            query = Physics.query,
            behavior = Physics.behavior,
            body = Physics.body,
            geometry = Physics.geometry,
            integrator = Physics.integrator,
            renderer = Physics.renderer,
            world = Physics.world;
        function addRenderer(world, appendChild) {

            var colors = {
                white: '#fff'
                , violet: '#542437'
                , blue: '#53777A'
            }
            var width = 800, height = 600;
            var container = document.createElement('div');
            container.className = 'exmaple';
            container.style.cssText = 'display:inline-block;  position: relative;;width:' + width + 'px;height:' + height + 'px';
            if (appendChild) {
                appendChild(container);
            } else {
                document.body.appendChild(container);
            }
            var renderer = Physics.renderer('canvas', {
                //metaEl: document.getElementById('mate'),
                // default styles of drawn objects
                el: container,
                width: width,
                height: height,
                autoResize: false,
                meta: false,
                styles: {

                    'point': colors.blue,

                    'circle': {
                        strokeStyle: colors.blue,
                        lineWidth: 1,
                        fillStyle: colors.blue,
                        angleIndicator: colors.white
                    },

                    'rectangle': {
                        strokeStyle: colors.violet,
                        lineWidth: 1,
                        fillStyle: colors.violet,
                        angleIndicator: colors.white
                    },

                    'convex-polygon': {
                        strokeStyle: colors.violet,
                        lineWidth: 1,
                        fillStyle: colors.violet,
                        angleIndicator: colors.white
                    }
                },
                offset: { x: 0, y: 0 }
            });
            world.add(renderer);
            renderer.options.onChange(function () {
                console.log(arguments)
            })
            return renderer;
        }


        exmapleInstance.addExample('引力', function ({ world, renderer }, page) {
            var width = 900, height = 900, centerVec = vector(width / 2, height / 2);
            renderer.resize(width, height);
            renderer.el.style.background = '#000';
            
            var subVec = centerVec.clone();
            var sun = Physics.body('circle', {
                /*
                dynamic:动态的身体被“正常”对待。它们是集成的,碰撞的,以及所有这些。
                kinematic:运动物体是以指定速度移动的物体。其他身体与它们相撞,但它们不会从其他身体反弹。
                static:静止的身体只是停滞不前。他们就像障碍。
                */
                treatment: "kinematic", is the body `dynamic`, `kinematic` or `static`?
                vx: 0,
                vy: 0,
                radius: 20,
                mass: 20.0,
                // body restitution. How "bouncy" is it?
                restitution: 1,
                // what is its coefficient of friction with another surface with COF = 1?
                cof: 1,
                styles: {
                    fillStyle: '#f80'
                }
            });
            // 添加轨迹
            function addTrajectory(n) {
                var bodies = [];
                for (var i = 1; i <= n; i++) {
                    var v = centerVec.clone();
                    var radius = 20 + i * 30;
                    var l = Physics.body('circle', {
                        treatment: 'static',
                        x: v.x,
                        y: v.y,
                        radius: radius,
                        styles: {
                            fillStyle: 'transparent',
                            strokeStyle: '#fff',
                            lineWidth: 1
                        }
                    })
                    bodies.push(l);
                }
                var p = Physics.body('compound', {
                    uid:'gj',
                    x: centerVec.x,
                    y: centerVec.y,
                    children: bodies,
                    treatment: 'static',
                    styles: {
                        fillStyle: 'transparent',
                        strokeStyle: '#fff',
                        lineWidth: 1
                    }
                })
                p.sleep()

                world.add(p)
            }
            function addGjq(p,angle,r,c){
                angle=angle/180*Math.PI;
                var v = centerVec.clone();
                    var radius = 20 + p * 30;
                    var x=Math.cos(angle)*radius;
                    var y=Math.sin(angle)*radius;
                    v.add(x,y)
                    var l = Physics.body('circle', {
                     //   treatment: 'static',
                        mass:1,
                        x: v.x,
                        y: v.y,
                        vx:0.1,
                        vy:0,
                        radius: r,
                        angle: 0,
                        angularVelocity: 0,
                        styles: {
                            fillStyle:c
                        }
                    })
                    verletConstraint.distanceConstraint(sun, l,0.1);
                    world.add(l);
            }
            
            sun.state.pos = subVec.clone();

            world.on({
                'interact:poke': function (pos) {

                },
                'interact:grab': function (d) {

                },
                'interact:release': function (d) {

                }
            });
            // 添加交互
            addInteractiveBehavior(world, {
                el: renderer.container
            });
        
            // 添加约束
            var verletConstraint = addVerletConstraintsBehavior(world);

            //添加引力点
             var attractor = addAttractorBehavior(world, {
                 pos: subVec.clone(),
                order: 0,
                 strength: 0.002
             })
            
            world.add(sun);
            addTrajectory(5);
       

            addGjq(1,110,8,'#ff0');
            addGjq(2,110,6,'#fa0');
            addGjq(3,110,4,'#0af');
            addGjq(4,110,6,'#fa0');
            addGjq(5,110,6,'#a0a')
            function random(min,max){
                return min+Math.round(Math.random()*(max-min));
            }
            page.addOperation('添加球',function(){
                addGjq(random(1,5),random(0,360),random(3,8),'#0af');
            })
        })

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值