**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;
})();

```

المراجع
-------

1. ↑  "Release 0.6.2". 28 مارس 2015. اطلع عليه بتاريخ 26 فبراير 2021. `{{استشهاد ويب}}`: تحقق من التاريخ في: `|access-date=` و`|date=` (مساعدة)
2. ↑  "npmjs". اطلع عليه بتاريخ 3 مارس 2023. `{{استشهاد ويب}}`: تحقق من التاريخ في: `|access-date=` (مساعدة)
3. ↑  "Stefan Hedman". *GitHub*. مؤرشف من الأصل في 2020-12-22. اطلع عليه بتاريخ 2017-04-27.
4. ↑  Prall، Chandler (10 أبريل 2012). "JavaScript Physics Engines Comparison". *Build New Games*. مؤرشف من الأصل في 2020-12-22. اطلع عليه بتاريخ 2017-04-27.
5. 1 2  Huber، Linda (2013). "Initial Steps for the Coupling of JavaScript Physics Engines with X3DOM". في Jan Bender؛ Jeremie Dequidt؛ Christian Duriez؛ Gabriel Zachmann (المحررون). *Workshop on Virtual Reality Interaction and Physical Simulation (VRIPHYS 2013)*. The Eurographics Association. ص. 81–90. DOI:10.2312/PE.vriphys.vriphys13.081-090. ISBN:978-3-905674-57-6.
6. ↑  "Background: What is X3DOM, and what can it do for me?". *official x3dom documentation*. x3dom.org. مؤرشف من الأصل في 2017-07-15. اطلع عليه بتاريخ 2017-04-27.
7. ↑  "Branch: master. cannon.js/README.markdown". GitHub. 22 أبريل 2015. مؤرشف من الأصل في 2020-12-22. اطلع عليه بتاريخ 2017-04-27.
8. ↑  "Cloth physics simulation". مؤرشف من الأصل في 2020-12-22.
9. ↑  "Create wonderful interactive games for the web: Using webgl and a physics engine (babylon.js & cannon.js)". مؤرشف من الأصل في 2020-12-22. اطلع عليه بتاريخ 2017-02-21.
10. ↑  "MSDN Game Development with Babylon.js". مؤرشف من الأصل في 2020-12-22. اطلع عليه بتاريخ 2017-02-21.
11. ↑  "Lance source repository". مؤرشف من الأصل في 2020-10-11.
12. ↑  "Cannon.js - JavaScripting". *www.javascripting.com*. مؤرشف من الأصل في 2020-09-26. اطلع عليه بتاريخ 2020-12-22.

روابط خارجية
------------

* الموقع الرسمي
* مستودع كود المصدر

* أيقونة بوابةبوابة برمجيات