كانون جي اس (برنامج)

Cannon.js هو محرك فيزيائي ثلاثي الأبعاد مكتوب بلغه الجافا سكريبت مفتوح المصدر تم إنشاؤه بواسطة Stefan "schteppe" Hedman. على عكس مكتبات محركات الفيزياء المنقولة من C ++ إلى الجافا سكريبت، فإن cannon.js مكتوب بلغة الجافا سكريبت منذ البداية حيث يمكنة ذلك من الاستفادة من جميع ميزاته. في مقارنة اجريت عام 2013 مع Ammo.js ، تم اكتشاف ان cannon.js «أكثر إحكاما، وأكثر قابلية للفهم، وأكثر قوة فيما يتعلق بأدائه وكذلك أسهل في الفهم»، ولكن لم يكن لديه العديد من الميزات.

المميزات 
Cannon.js يدعم الأشكال التالية: الاجسام كروى ة، مربات، اسطوانات، متعدد الوجوه محدب، الجسيمات، و heightfield . تطابق هذه المجموعة من الأشكال المجموعة التي تستخدمها محركات العرض مثل Three.js و Babylon ، لكنها ليست كاملة. على سبيل المثال، لا يكفي لـ X3DOM ،  تطبيق X3D الذي يسمح بتضمين رسومات ثلاثية الأبعاد في صفحات الويب دون الحاجة إلى مكون إضافي.

يطبق محرك الفيزياء ديناميكيات الجسم الصلب، واكتشاف الاصطدام المنفصل، وحل قيود Gauss-Seidel. يمكن إجراء محاكاة القماش 

يمكن استخدام Cannon.js مع Three.js و Babylon.js   عارضات WebGL لإنشاء مشاهد ثلاثية الأبعاد قائمة على الفيزياء. يمكن استخدامه أيضًا لتوفير مزامنة فيزياء الشبكات للألعاب متعددة اللاعبين عبر الإنترنت باستخدام Lance.gg

مثال 
يُنشئ نموذج التعليمة البرمجية أدناه كرة على مستوى، ويخطو خطوات المحاكاة، ويطبع محاكاة المجال إلى وحدة التحكم. لاحظ أن Cannon.js يستخدم وحدات SI (متر، كيلوغرام، ثانية، إلخ).//إعداد عالمنا
var world = new CANNON.World();
world.gravity.set(0, 0, -9.82); // m/s²

// إنشاء كرة
var radius = 1; // m
var sphereBody = new CANNON.Body({
   mass: 5, // kg
   position: new CANNON.Vec3(0, 0, 10), // m
   shape: new CANNON.Sphere(radius)
});
world.addBody(sphereBody);

//إنشاء مستوى
var groundBody = new CANNON.Body({
    mass: 0 // mass == 0 makes the body static
});
var groundShape = new CANNON.Plane();
groundBody.addShape(groundShape);
world.addBody(groundBody);

var fixedTimeStep = 1.0 / 60.0; // seconds
var maxSubSteps = 3;

//بدء حلقة المحاكاة
var lastTime;
(function simloop(time){
  requestAnimationFrame(simloop);
  if(lastTime !== undefined){
     var dt = (time - lastTime) / 1000;
     world.step(fixedTimeStep, dt, maxSubSteps);
  }
  console.log("Sphere z position: " + sphereBody.position.z);
  lastTime = time;
})();

المراجع

روابط خارجية 

 
 مستودع كود المصدر

برمجيات تستخدم رخصة إم أي تي
محركات فيزيائية حاسوبية