ম্যাটারজেএস এর সাথে অন্যান্য সংস্থার মাধ্যমে জোর-টেনে নিয়ে যাওয়া দেহগুলি প্রতিরোধ করুন


14

আমি পদার্থবিজ্ঞান ভিত্তিক গেমের জন্য ম্যাটারজেগুলি ব্যবহার করছি এবং অন্য সংস্থাগুলির মাধ্যমে মাউস দ্বারা জোর করে টানা দেহগুলি রোধ করার সমস্যার সমাধান খুঁজে পাইনি। আপনি যদি কোনও দেহকে অন্য শরীরে টেনে আনেন তবে দেহটি টেনে নিয়ে যাওয়া নিজেকে অন্য দেহে প্রবেশ করতে বাধ্য করতে পারে। তাদের ছেদ করা থেকে রোধ করার জন্য আমি একটি নির্ভরযোগ্য উপায় সন্ধান করছি। আপনি এই প্রভাবটি যে কোনও ম্যাটারজেএস ডেমোতে মাউসের সাহায্যে কোনও দেহ নির্বাচন করে এবং অন্য কোনও শরীরে জোর করার চেষ্টা করতে পারেন। এখানে একটি সাধারণ উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন

https://brm.io/matter-js/demo/#staticFriction

দুর্ভাগ্যক্রমে এটি ড্রাগ এবং ড্রপের উপর নির্ভর করে কোনও গেমস বা সিমুলেশনগুলি ভঙ্গ করে। আমি অনেকগুলি সমাধানের চেষ্টা করেছি, যেমন কোনও সংঘর্ষের সময় মাউসের সীমাবদ্ধতা ভেঙে দেওয়া বা সীমাবদ্ধতা কড়া হ্রাস করা, তবে নির্ভরযোগ্যভাবে কাজ করে এমন কিছুই নয়।

কোন পরামর্শ স্বাগত!


জোর-টেনে নিয়ে যাওয়া শব্দটি বুঝতে পারছি না। আপনি কি বোঝাতে চেয়েছেন যে আপনার টেনে নিয়ে যাওয়া শরীরটি অন্য কোনও মৃতদেহের মধ্যে দিয়ে যাওয়া উচিত?
গ্রোডজি

না, এর অর্থ হ'ল টানা দেহটিকে অন্য কোনও মৃতদেহে যেতে বাধা দেওয়া উচিত।
d13

1
@ d13 আপনি সমস্যাটি দেখানো কোনও অ্যানিমেশন যুক্ত করতে পারবেন? যেহেতু শব্দের উপর ভিত্তি করে কিছু বিভ্রান্তি আছে বলে মনে হচ্ছে ...
ঘোস্ট

2
@ খোস্ট যোগ হয়েছে ...
d13

@ d13 যা বিষয়গুলিকে আরও স্পষ্ট করে তোলে ..... এটি একটি কৌতূহলপূর্ণ
ঘোস্ট

উত্তর:


6

আমি মনে করি যে এখানে সর্বোত্তম উত্তর হ'ল Matter.Resolverকোনও সংস্থার মধ্যে শারীরিক দ্বন্দ্বের ভবিষ্যদ্বাণীমূলক এড়ানো কার্যকর করার জন্য মডিউলটির একটি তাৎপর্যপূর্ণ মূল্যায়ন হবে । এর থেকে কম যে কোনও কিছু নির্দিষ্ট পরিস্থিতিতে ব্যর্থ হওয়ার গ্যারান্টিযুক্ত । এখানে বলা হচ্ছে দুটি "সমাধান" যা বাস্তবে, কেবলমাত্র আংশিক সমাধান। সেগুলি নীচে বর্ণিত।


সমাধান 1 (আপডেট)

এই সমাধানের বিভিন্ন সুবিধা রয়েছে:

  • এটি সমাধান 2 এর চেয়ে বেশি সংক্ষিপ্ত
  • এটি সলিউশন 2 এর চেয়ে ছোট একটি কম্পিউটেশনাল পায়ের ছাপ তৈরি করে
  • সলিউশন 2-তে ড্র্যাগ আচরণটি যেমন হয় তাতে বাধা হয় না
  • এটি অ-ধ্বংসাত্মকভাবে সমাধান 2 এর সাথে সংযুক্ত করা যেতে পারে

এই পদ্ধতির পিছনে ধারণাটি হল " যখন একটি অচলাঞ্চল শক্তি একটি স্থাবর বস্তুর সাথে মিলিত হয়" তখন জোর করে স্টপেবলকে রেন্ডার করে কী ঘটে যায় তার প্যারাডাক্স সমাধান করা । এটি এর দ্বারা সক্ষম করা হয়েছে Matter.Event beforeUpdate, যা positionImpulseপ্রতিটি দিকের পরম গতি এবং আবেগকে (বা বরং , যা প্রকৃতপক্ষে শারীরিক অনুপ্রেরণা নয়) ব্যবহারকারী-সংজ্ঞায়িত সীমার মধ্যে সীমাবদ্ধ রাখতে দেয়।

window.addEventListener('load', function() {
    var canvas = document.getElementById('world')
    var mouseNull = document.getElementById('mouseNull')
    var engine = Matter.Engine.create();
    var world = engine.world;
    var render = Matter.Render.create({    element: document.body, canvas: canvas,
                 engine: engine, options: { width: 800, height: 800,
                     background: 'transparent',showVelocity: true }});
    var body = Matter.Bodies.rectangle(400, 500, 200, 60, { isStatic: true}), 
        size = 50, counter = -1;
     
    var stack = Matter.Composites.stack(350, 470 - 6 * size, 1, 6, 
                                        0, 0, function(x, y) {
     return Matter.Bodies.rectangle(x, y, size * 2, size, {
         slop: 0, friction: 1,    frictionStatic: Infinity });
    });
    Matter.World.add(world, [ body, stack,
     Matter.Bodies.rectangle(400, 0, 800, 50, { isStatic: true }),
     Matter.Bodies.rectangle(400, 600, 800, 50, { isStatic: true }),
     Matter.Bodies.rectangle(800, 300, 50, 600, { isStatic: true }),
     Matter.Bodies.rectangle(0, 300, 50, 600, { isStatic: true })
    ]);

    Matter.Events.on(engine, 'beforeUpdate', function(event) {
     counter += 0.014;
     if (counter < 0) { return; }
     var px = 400 + 100 * Math.sin(counter);
     Matter.Body.setVelocity(body, { x: px - body.position.x, y: 0 });
     Matter.Body.setPosition(body, { x: px, y: body.position.y });
     if (dragBody != null) {
        if (dragBody.velocity.x > 25.0) {
            Matter.Body.setVelocity(dragBody, {x: 25, y: dragBody.velocity.y });
        }
        if (dragBody.velocity.y > 25.0) {
            Matter.Body.setVelocity(dragBody, {x: dragBody.velocity.x, y: 25 });
        }
        if (dragBody.positionImpulse.x > 25.0) {
            dragBody.positionImpulse.x = 25.0;
        }
        if (dragBody.positionImpulse.y > 25.0) {
            dragBody.positionImpulse.y = 25.0;
        }
    }
    });

    var mouse = Matter.Mouse.create(render.canvas),
     mouseConstraint = Matter.MouseConstraint.create(engine, { mouse: mouse,
         constraint: { stiffness: 0.1, render: { visible: false }}});
     
    var dragBody = null


    Matter.Events.on(mouseConstraint, 'startdrag', function(event) {
     dragBody = event.body;
    });
    
    Matter.World.add(world, mouseConstraint);
    render.mouse = mouse;
    Matter.Engine.run(engine);
    Matter.Render.run(render);
});
<canvas id="world"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.10.0/matter.js"></script>

উদাহরণে আমি সীমাবদ্ধ করছি velocityএবং positionImpulsexএবং yসর্বোচ্চ মাত্রার 25.0। ফলাফলটি নীচে দেখানো হয়েছে

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন, মৃতদেহগুলি টেনে নিয়ে যাওয়ার ক্ষেত্রে বেশ হিংস্র হওয়া সম্ভব এবং তারা একে অপরের মধ্য দিয়ে যাবে না। এটি অন্যদের থেকে পৃথক করে এই পদ্ধতির সেট করে: ব্যবহারকারী যখন তাদের টেনে নিয়ে যথেষ্ট পরিমাণে সহিংস হয় তখন বেশিরভাগ অন্যান্য সম্ভাব্য সমাধান ব্যর্থ হয়।

এই পদ্ধতির সাথে আমি যে সমস্যার মুখোমুখি হয়েছি সেটাই হ'ল Resolverমডিউলটি যে সংঘর্ষটি সনাক্ত করতে ব্যর্থ হবে এবং যেখানে এটির সংঘর্ষ সনাক্ত করতে ব্যর্থ হবে তার পর্যাপ্ত বেগ দেওয়ার জন্য অন্য একটি অ স্থিতিশীল দেহে আঘাত করার জন্য একটি স্থিতিশীল শরীর ব্যবহার করা সম্ভব hard দ্বিতীয় শরীর অন্য শরীরের মধ্য দিয়ে যেতে হবে। (স্থিতিশীল ঘর্ষণ উদাহরণে প্রয়োজনীয় বেগ প্রায় 50.0, আমি কেবল এটি সফলভাবে একবারে পরিচালনা করতে পেরেছি এবং ফলস্বরূপ আমার এটিকে চিত্রিত করার কোনও অ্যানিমেশন নেই)।


সমাধান 2

এটি একটি অতিরিক্ত সমাধান, ন্যায্য সতর্কতা যদিও: এটি সোজা নয়।

বিস্তৃত ভাষায় এই কাজটি করার উপায়টি পরীক্ষা করে দেখা হচ্ছে যে শরীরটি টেনে আনা হচ্ছে কিনা, dragBodyকোনও স্থির শরীরের সাথে সংঘর্ষ হয়েছে এবং যদি মাউসটি dragBodyঅনুসরণ না করে খুব বেশি দূরে চলে গেছে । যদি এটি সনাক্ত করে যে মাউসের মধ্যে বিভাজনটি dragBodyখুব বেশি হয়ে গেছে এবং এটি ইভেন্ট শ্রোতাদের থেকে সরিয়ে দেয় এবং এটিকে একটি ভিন্ন মাউসমেভ ফাংশন দিয়ে প্রতিস্থাপন করে ,। এই ফাংশনটি পরীক্ষা করে যদি মাউস শরীরের কেন্দ্রের প্রদত্ত নিকটবর্তী অঞ্চলে ফিরে আসে। দুর্ভাগ্যক্রমে আমি অন্তর্নির্মিত পদ্ধতিটি সঠিকভাবে কাজ করতে পেলাম না তাই আমাকে এটি সরাসরি অন্তর্ভুক্ত করতে হয়েছিল (জাভাস্ক্রিপ্টে আমার চেয়ে আরও বেশি জ্ঞানবান কাউকে সেই বিষয়টি বের করতে হবে)। অবশেষে, কোনও ইভেন্ট সনাক্ত হলে এটি সাধারণ শ্রোতার কাছে ফিরে যায় ।Matter.js mouse.mousemovemouse.elementmousemove()Matter.Mouse._getRelativeMousePosition()mouseupmousemove

window.addEventListener('load', function() {
    var canvas = document.getElementById('world')
    var mouseNull = document.getElementById('mouseNull')
    var engine = Matter.Engine.create();
    var world = engine.world;
    var render = Matter.Render.create({ element: document.body, canvas: canvas,
                 engine: engine, options: { width: 800, height: 800,
                     background: 'transparent',showVelocity: true }});
    var body = Matter.Bodies.rectangle(400, 500, 200, 60, { isStatic: true}), 
        size = 50, counter = -1;
     
    var stack = Matter.Composites.stack(350, 470 - 6 * size, 1, 6, 
                                        0, 0, function(x, y) {
     return Matter.Bodies.rectangle(x, y, size * 2, size, {
         slop: 0.5, friction: 1,    frictionStatic: Infinity });
    });
    Matter.World.add(world, [ body, stack,
     Matter.Bodies.rectangle(400, 0, 800, 50, { isStatic: true }),
     Matter.Bodies.rectangle(400, 600, 800, 50, { isStatic: true }),
     Matter.Bodies.rectangle(800, 300, 50, 600, { isStatic: true }),
     Matter.Bodies.rectangle(0, 300, 50, 600, { isStatic: true })
    ]);

    Matter.Events.on(engine, 'beforeUpdate', function(event) {
     counter += 0.014;
     if (counter < 0) { return; }
     var px = 400 + 100 * Math.sin(counter);
     Matter.Body.setVelocity(body, { x: px - body.position.x, y: 0 });
     Matter.Body.setPosition(body, { x: px, y: body.position.y });
    });

    var mouse = Matter.Mouse.create(render.canvas),
     mouseConstraint = Matter.MouseConstraint.create(engine, { mouse: mouse,
         constraint: { stiffness: 0.2, render: { visible: false }}});
     
    var dragBody, overshoot = 0.0, threshold = 50.0, loc, dloc, offset, 
    bodies = Matter.Composite.allBodies(world), moveOn = true;
    getMousePosition = function(event) {
     var element = mouse.element, pixelRatio = mouse.pixelRatio, 
        elementBounds = element.getBoundingClientRect(),
        rootNode = (document.documentElement || document.body.parentNode || 
                    document.body),
        scrollX = (window.pageXOffset !== undefined) ? window.pageXOffset : 
                   rootNode.scrollLeft,
        scrollY = (window.pageYOffset !== undefined) ? window.pageYOffset : 
                   rootNode.scrollTop,
        touches = event.changedTouches, x, y;
     if (touches) {
         x = touches[0].pageX - elementBounds.left - scrollX;
         y = touches[0].pageY - elementBounds.top - scrollY;
     } else {
         x = event.pageX - elementBounds.left - scrollX;
         y = event.pageY - elementBounds.top - scrollY;
     }
     return { 
         x: x / (element.clientWidth / (element.width || element.clientWidth) *
            pixelRatio) * mouse.scale.x + mouse.offset.x,
         y: y / (element.clientHeight / (element.height || element.clientHeight) *
            pixelRatio) * mouse.scale.y + mouse.offset.y
     };
    };     
    mousemove = function() {
     loc = getMousePosition(event);
     dloc = dragBody.position;
     overshoot = ((loc.x - dloc.x)**2 + (loc.y - dloc.y)**2)**0.5 - offset;
     if (overshoot < threshold) {
         mouse.element.removeEventListener("mousemove", mousemove);
         mouse.element.addEventListener("mousemove", mouse.mousemove);
         moveOn = true;
     }
    }
    Matter.Events.on(mouseConstraint, 'startdrag', function(event) {
     dragBody = event.body;
     loc = mouse.position;
     dloc = dragBody.position;
     offset = ((loc.x - dloc.x)**2 + (loc.y - dloc.y)**2)**0.5;
     Matter.Events.on(mouseConstraint, 'mousemove', function(event) {
         loc = mouse.position;
         dloc = dragBody.position;
         for (var i = 0; i < bodies.length; i++) {                      
             overshoot = ((loc.x - dloc.x)**2 + (loc.y - dloc.y)**2)**0.5 - offset;
             if (bodies[i] != dragBody && 
                 Matter.SAT.collides(bodies[i], dragBody).collided == true) {
                 if (overshoot > threshold) {
                     if (moveOn == true) {
                         mouse.element.removeEventListener("mousemove", mouse.mousemove);
                         mouse.element.addEventListener("mousemove", mousemove);
                         moveOn = false;
                     }
                 }
             }
         }
     });
    });

    Matter.Events.on(mouseConstraint, 'mouseup', function(event) {
     if (moveOn == false){
         mouse.element.removeEventListener("mousemove", mousemove);
         mouse.element.addEventListener("mousemove", mouse.mousemove);
         moveOn = true;
     }
    });
    Matter.Events.on(mouseConstraint, 'enddrag', function(event) {
     overshoot = 0.0;
     Matter.Events.off(mouseConstraint, 'mousemove');
    });

    Matter.World.add(world, mouseConstraint);
    render.mouse = mouse;
    Matter.Engine.run(engine);
    Matter.Render.run(render);
});
<canvas id="world"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.10.0/matter.js"></script>

ইভেন্ট শ্রোতার স্যুইচিং স্কিম প্রয়োগ করার পরে সংস্থাগুলি এখন আরও এই জাতীয় আচরণ করে

এখানে চিত্র বর্ণনা লিখুন

আমি এটি মোটামুটি ভালভাবে পরীক্ষা করে দেখেছি , তবে এটি প্রতিটি ক্ষেত্রে কার্যকর হবে তা আমি গ্যারান্টি দিতে পারি না। এটি লক্ষণীয়ও রয়েছে যে mouseupঘটনাটি সনাক্ত হওয়ার পরে মাউসটি ক্যানভাসের মধ্যে না থাকলে ঘটনাটি সনাক্ত করা যায় না - তবে এটি কোনও ম্যাটার.জেসের ক্ষেত্রে সত্য ismouseup সনাক্তকরণের তাই আমি এটি ঠিক করার চেষ্টা করিনি।

বেগ যদি যথেষ্ট পরিমাণে বড় হয় তবে Resolverকোনও সংঘর্ষ সনাক্ত করতে ব্যর্থ হবে এবং যেহেতু এটি শারীরিক দ্বন্দ্বের এই গন্ধটির পূর্বাভাসমূলক প্রতিরোধের অভাব রয়েছে, তাই এখানে প্রদর্শিত হিসাবে দেহটি শরীরকে অতিক্রম করবে।

এখানে চিত্র বর্ণনা লিখুন

সমাধান 1 এর সাথে একত্রিত হয়ে এটি সমাধান করা যেতে পারে

এখানে একটি সর্বশেষ নোট, এটি কেবলমাত্র নির্দিষ্ট ইন্টারঅ্যাকশনগুলিতে প্রয়োগ করা সম্ভব (যেমন স্ট্যাটিক এবং অ স্থিতিশীল শরীরের মধ্যে)। এটি করা পরিবর্তন দ্বারা সম্পন্ন হয়

if (bodies[i] != dragBody && Matter.SAT.collides(bodies[i], dragBody).collided == true) {
    //...
}

থেকে (যেমন স্থির মৃতদেহের জন্য)

if (bodies[i].isStatic == true && bodies[i] != dragBody && 
    Matter.SAT.collides(bodies[i], dragBody).collided == true) {
    //...
}

ব্যর্থ সমাধান

যদি ভবিষ্যতে কোন ব্যবহারকারীকে এই প্রশ্নের জুড়ে আসা এবং উভয় সমাধান তাদের ব্যবহার ক্ষেত্রে জন্য অপর্যাপ্ত এটি, এখানে সমাধান আমি চেষ্টা যা করেনি কিছু না হবে। না করার জন্য প্রকারের একটি গাইড।

  • কল করা হচ্ছে mouse.mouseupসরাসরি করা: অবিলম্বে অবজেক্টটি মোছা।
  • mouse.mouseupমাধ্যমে কল করা Event.trigger(mouseConstraint, 'mouseup', {mouse: mouse}): এর দ্বারা ওভাররাইড করা Engine.update, আচরণটি অপরিবর্তিত।
  • টানা টানা বস্তুটিকে অস্থায়ীভাবে স্থিতিশীল করা: অ-স্থিতিশীল (যে মাধ্যমেই হোক Matter.Body.setStatic(body, false)বা না হোক body.isStatic = false) ফেরত দেওয়ার পরে অবজেক্টটি মোছা হয়েছে ।
  • (0,0)মাধ্যমে ফোর্স সেট করা হচ্ছেsetForce যখন দ্বন্দ্ব সমীপবর্তী সঠিক নয়: অবজেক্ট এখনও মাধ্যমে প্রেরণ করতে পারেন বাস্তবায়িত করা প্রয়োজন হবে Resolverআসলে কাজ করতে।
  • পরিবর্তনের mouse.elementমাধ্যমে setElement()বা পরিবর্তনের মাধ্যমে আলাদা ক্যানভাসে পরিবর্তন করা হচ্ছেmouse.element : অবিলম্বে অবজেক্টটি মোছা।
  • অবজেক্টটিকে সর্বশেষ 'বৈধ' অবস্থানে ফিরিয়ে দেওয়া: এখনও এর মধ্য দিয়ে যেতে দেয়,
  • এর মাধ্যমে আচরণ পরিবর্তন করুন collisionStart: বেমানান সংঘর্ষ শনাক্তকরণ এখনও এই পদ্ধতির মধ্য দিয়ে যাওয়ার অনুমতি দেয়


আপনার অবদানের জন্য অনেক ধন্যবাদ! আমি আপনাকে অনুগ্রহ দান করেছি কারণ আপনার সমাধানটি নিখুঁত না হলেও এটি অবশ্যই এগিয়ে যাওয়ার পথ নির্দেশ করে এবং আপনি এই সমস্যার জন্য বিপুল পরিমাণ চিন্তাভাবনা এবং সময় রেখেছিলেন - আপনাকে ধন্যবাদ !! আমি এখন নিশ্চিত হয়েছি যে এই সমস্যাটি শেষ পর্যন্ত ম্যাটারজেএস-এর একটি বৈশিষ্ট্য-ফাঁক, এবং আশা করি এই আলোচনা ভবিষ্যতে একটি বাস্তব সমাধানে ভূমিকা রাখবে।
d13

@ ডি 13 ধন্যবাদ, আমি সম্মত হই যে সমস্যাটি শেষ পর্যন্ত অন্তর্নিহিত কোডে রয়েছে তবে আমি খুশি হলাম যে আমি সমাধানের কিছু লক্ষণ পেতে পারি
উইলিয়াম মিলার

0

আমি অন্য উপায়ে বৈশিষ্ট্যটি পরিচালনা করতে পারতাম:

  • কোনও "টানুন" (সুতরাং অফসেট ভিএস টানা ড্রাগের সাথে ড্র্যাগপয়েন্টের কোনও ধারাবাহিক প্রান্তিককরণ নেই)
  • মাউসডাউনে মাউস পয়েন্টার পজিশনটি অবজেক্ট অনুসরণ করার জন্য একটি ওরিয়েন্টেড বেগ ভেক্টর দেয়
  • মাউসআপে আপনার বেগের ভেক্টর পুনরায় সেট করুন
  • বিষয়টি সিমুলেশনটি বাকি কাজটি করতে দিন

1
কীন্ডা কীভাবে matter.jsইতিমধ্যে দেহগুলিকে টেনে আনতে পরিচালনা করে? থেকে এখানে "... একটি ভার্চুয়াল বসন্ত মতো মাউস দিক মাউসের সংযুক্ত হয় তখন টেনে ... বসন্ত [শরীর থেকে] সংযুক্ত করা হয় এবং টানাপড়েনে ...।"
গোস্ট

কেবল বেগ নির্ধারণ করা ওভারল্যাপটিকে টেনে আনতে বাধা দেয়, স্পিং অন্যকে দিয়ে দেহকে জোর করে।
মোসেই রাগুজ্জিনি

এটি আসলে কোনও সমাধানের দিকে নির্দেশ করতে পারে। যদি আমি সঠিকভাবে বুঝতে পারি তবে এর অর্থ মাউসকন্ট্রেন্টে নির্মিত ম্যাটারজেএস ব্যবহার না করা এবং মাউসের অবস্থানের ভিত্তিতে শরীরের গতিবেগটি ম্যানুয়ালি সেট করা না not এটি ঠিক কীভাবে কার্যকর করা হবে তা আমি নিশ্চিত নই, তবে কেউ যদি সেটপজিশন বা সীমাবদ্ধতা ব্যবহার না করে শরীরকে কীভাবে মাউসের অবস্থানের সাথে সামঞ্জস্য করে সে সম্পর্কে বিশদ পোস্ট করতে পারে তবে দয়া করে করুন।
d13

@ d13 আপনি এখনও ম্যাটারজেএস-এর উপর নির্ভর করছেন যে সংঘর্ষিত লাশগুলির বিষয়ে Resolverকী সিদ্ধান্ত নেবেন - এই কোডটি বেশ ন্যায্যভাবে দেখে আমি আশা করি এটি এখনও অনেক পরিস্থিতিতে টানা-যাওয়ার অনুমতি দেওয়ার সিদ্ধান্ত নেবে ..... আপনি যদি কাজ করতে পারেন তবে এছাড়াও আপনার নিজস্ব সংস্করণটি বাস্তবায়ন করেছে solveVelocityএবং solvePositionতবে আপনি এখনও ম্যাটারজেএস সরাসরি হ্যান্ডেল করতে চান এমনটি আপনি ম্যানুয়ালি করছেন ....
ঘোস্ট

0

টেনে আনার সময় সংঘর্ষ নিয়ন্ত্রণ করতে আপনার সংঘর্ষের ফিল্টার এবং ইভেন্টগুলি ব্যবহার করতে হবে

ডিফল্ট সংঘর্ষের ফিল্টার মাস্ক সহ দেহগুলি তৈরি করুন 0x0001। ক্যাচ startdragএবং enddragইভেন্টগুলি যুক্ত করুন এবং অস্থায়ীভাবে সংঘর্ষগুলি এড়াতে বিভিন্ন শরীরের সংঘর্ষ ফিল্টার বিভাগ নির্ধারণ করুন ।

Matter.Events.on(mouseConstraint, 'startdrag', function(event) {
    event.body.collisionFilter.category = 0x0008; // move body to new category to avoid collision
});
Matter.Events.on(mouseConstraint, 'enddrag', function(event) {
     event.body.collisionFilter.category = 0x0001; // return body to default category to activate collision
});

window.addEventListener('load', function () {

  //Fetch our canvas
  var canvas = document.getElementById('world');

  //Setup Matter JS
  var engine = Matter.Engine.create();
  var world = engine.world;
  var render = Matter.Render.create({
                                      canvas: canvas,
                                      engine: engine,
                                      options: {
                                        width: 800,
                                        height: 800,
                                        background: 'transparent',
                                        wireframes: false,
                                        showAngleIndicator: false
                                      }
                                    });

  //Add a ball
  const size = 50;
  const stack = Matter.Composites.stack(350, 470 - 6 * size, 1, 6, 0, 0, (x, y) => {
    return Matter.Bodies.rectangle(x, y, size * 2, size, {
      collisionFilter: {
            mask: 0x0001,
      },
      slop: 0.5,
      friction: 1,
      frictionStatic: Infinity,
    });
  });

  Matter.World.add(engine.world, stack);

  //Add a floor
  var floor = Matter.Bodies.rectangle(250, 520, 500, 40, {
    isStatic: true, //An immovable object
    render: {
      visible: false
    }
  });
  Matter.World.add(world, floor);

  //Make interactive
  var mouseConstraint = Matter.MouseConstraint.create(engine, { //Create Constraint
    element: canvas,

    constraint: {
      render: {
        visible: false
      },
      stiffness: 0.8
    }
  });
  Matter.World.add(world, mouseConstraint);

  // add events to listen drag
  Matter.Events.on(mouseConstraint, 'startdrag', function (event) {
    event.body.collisionFilter.category = 0x0008; // move body to new category to avoid collision
  });
  Matter.Events.on(mouseConstraint, 'enddrag', function (event) {
    event.body.collisionFilter.category = 0x0001; // return body to default category to activate collision
  });

  //Start the engine
  Matter.Engine.run(engine);
  Matter.Render.run(render);

});
<canvas id="world"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.10.0/matter.min.js"></script>


1
আপনাকে দুর্দান্ত ডেমো জন্য অনেক ধন্যবাদ! আমি প্রকৃতপক্ষে বিপরীত প্রভাব অর্জন করার চেষ্টা করছি: যখন অন্যকে টেনে নিয়ে যাওয়া হয় তখন আমাকে দেহগুলি ছেদ করা থেকে আটকাতে হবে।
d13

দুঃখিত যদি আমি বিষয়টি ভুল বুঝে থাকি। মৃতদেহগুলি ছেদ করা থেকে বাধা দিয়ে আপনি কী বোঝাতে চেয়েছেন তা কি আপনি পরিষ্কার করতে পারেন? আপনি যখন জোর প্রয়োগ করেন তখন কি অন্য অবজেক্টের মাধ্যমে টেনে আটকানোর চেষ্টা করছেন?
তেমুর তচানুকভাদজে

1
সেক্ষেত্রে এটি ওপেন ইস্যু এবং সিসিডি বাস্তবায়নের জন্য হার্ড-কোডিং ছাড়া করা যাবে না। একবার দেখুন: github.com/liabru/matter-js/issues/5
তেমুর তচনুকভাদজে

0

এটি তাদের গিটহাব পৃষ্ঠায় 672 ইস্যুর সাথে সম্পর্কিত বলে মনে হচ্ছে যা মনে হয় যে এটি অবিচ্ছিন্ন সংঘর্ষ সনাক্তকরণের (সিসিডি) অভাবের কারণে ঘটেছিল।

এটির প্রতিকারের চেষ্টা করা হয়েছে এবং এর কোডটি এখানে পাওয়া যাবে তবে সমস্যাটি এখনও খোলা রয়েছে বলে মনে হচ্ছে আপনার নিজের মধ্যে সিসিডি তৈরি করতে ইঞ্জিনটি সম্পাদনা করার প্রয়োজন হতে পারে।


1
আপনার উত্তরের জন্য ধন্যবাদ! আমি এটি বিবেচনা করেছিলাম তবে আমি বিশ্বাস করি এটি কোনও সিসিডি সমস্যা নয় তবে "একটি অচলাঞ্চল শক্তি যখন অস্থির বাধা পূরণ করে তখন কী হয়?" মৃতদেহগুলি ছেদ হতে আটকাতে কীভাবে বাহিনীকে নিরপেক্ষ করা যায় তা আমি কোনওভাবেই খুঁজে বের করতে পারি।
d13
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.