Cannon.js هو محرك فيزيائي ثلاثي الأبعاد مكتوب بلغه الجافا سكريبت مفتوح المصدر تم إنشاؤه بواسطة Stefan "schteppe" Hedman.[3] على عكس مكتبات محركات الفيزياء المنقولة من C ++ إلى الجافا سكريبت، فإن cannon.js مكتوب بلغة الجافا سكريبت منذ البداية حيث يمكنة ذلك من الاستفادة من جميع ميزاته.[4] في مقارنة اجريت عام 2013 مع Ammo.js ، تم اكتشاف ان cannon.js «أكثر إحكاما، وأكثر قابلية للفهم، وأكثر قوة فيما يتعلق بأدائه وكذلك أسهل في الفهم»، ولكن لم يكن لديه العديد من الميزات.[5]
المميزات
Cannon.js يدعم الأشكال التالية: الاجسام كروى ة، مربات، اسطوانات، متعدد الوجوه محدب، الجسيمات، و heightfield . تطابق هذه المجموعة من الأشكال المجموعة التي تستخدمها محركات العرض مثل Three.js و Babylon ، لكنها ليست كاملة. على سبيل المثال، لا يكفي لـ X3DOM ، [5] تطبيق X3D الذي يسمح بتضمين رسومات ثلاثية الأبعاد في صفحات الويب دون الحاجة إلى مكون إضافي.[6]
يطبق محرك الفيزياء ديناميكيات الجسم الصلب، واكتشاف الاصطدام المنفصل، وحل قيود Gauss-Seidel.[7] يمكن إجراء محاكاة القماش [8]
يمكن استخدام Cannon.js مع Three.js و Babylon.js [9] [10] عارضات WebGL لإنشاء مشاهد ثلاثية الأبعاد قائمة على الفيزياء. يمكن استخدامه أيضًا لتوفير مزامنة فيزياء الشبكات للألعاب متعددة اللاعبين عبر الإنترنت باستخدام Lance.gg [11]
يُنشئ نموذج التعليمة البرمجية أدناه كرة على مستوى، ويخطو خطوات المحاكاة، ويطبع محاكاة المجال إلى وحدة التحكم. لاحظ أن 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;
})();
المراجع
روابط خارجية