ammo.js-bullet物理引擎碰撞检测
时间:2022-07-23
本文章向大家介绍ammo.js-bullet物理引擎碰撞检测,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
之前用ammojs写了一点点动画:微信小程序体验3D物理引擎-ammo.js,把碰撞检测的代码写一下,Mark下,记个笔记:
碰撞检测
function updatePhysics(deltaTime) {
physicsWorld.stepSimulation(deltaTime);
//physicsWorld.performDiscreteCollisionDetection();
var numManifolds=dispatcher.getNumManifolds();
for(var i=0; i<numManifolds; i++){
var contactManifold=dispatcher.getManifoldByIndexInternal(i);
var objA=contactManifold.getBody0();
var objB=contactManifold.getBody1();
var numContacts = contactManifold.getNumContacts();
//console.log(numContacts,objA,objB);
for(var j=0; j<numContacts; j++)
{
var pt = contactManifold.getContactPoint(j);
if(pt.getDistance()<=0.0){
var posA = pt.getPositionWorldOnA();
var posB = pt.getPositionWorldOnB();
console.log("A:",i, posA.x(), posA.y(), posA.z()); // 碰撞点
console.log("B:",i, posB.x(), posB.y(), posB.z());
}
}
}
// 更新物体位置
for (var i = 0, iL = rigidBodies.length; i <iL; i++ ){
var objThree = rigidBodies[i];
var objPhys = objThree.userData.physicsBody;
var ms = objPhys.getMotionState();
if (ms) {
ms.getWorldTransform(transformAux1);
var p = transformAux1.getOrigin();
var q = transformAux1.getRotation();
objThree.position.set(p.x(), p.y(), p.z());
objThree.quaternion.set(q.x(), q.y(), q.z(), q.w());
}
}
}
创建TriangleMesh的Shape:
function createTriangleShapeByGeometry(geometry) {
var mesh = new Ammo.btTriangleMesh(true, true);
var vertices = geometry.vertices;
for (var i = 0; i < geometry.faces.length; i++) {
var face = geometry.faces[i];
if (face instanceof THREE.Face3) {
mesh.addTriangle(
new Ammo.btVector3(vertices[face.a].x, vertices[face.a].y, vertices[face.a].z),
new Ammo.btVector3(vertices[face.b].x, vertices[face.b].y, vertices[face.b].z),
new Ammo.btVector3(vertices[face.c].x, vertices[face.c].y, vertices[face.c].z),
false
);
} else if (face instanceof THREE.Face4) {
mesh.addTriangle(
new Ammo.btVector3(vertices[face.a].x, vertices[face.a].y, vertices[face.a].z),
new Ammo.btVector3(vertices[face.b].x, vertices[face.b].y, vertices[face.b].z),
new Ammo.btVector3(vertices[face.d].x, vertices[face.d].y, vertices[face.d].z),
false
);
mesh.addTriangle(
new Ammo.btVector3(vertices[face.b].x, vertices[face.b].y, vertices[face.b].z),
new Ammo.btVector3(vertices[face.c].x, vertices[face.c].y, vertices[face.c].z),
new Ammo.btVector3(vertices[face.d].x, vertices[face.d].y, vertices[face.d].z),
false
);
}
}
var shape = new Ammo.btBvhTriangleMeshShape(mesh, true, true);
return shape;
}
例如创建一条管道的Shape:
var ballMass = 35;
var ballRadius = 0.4;
var path = new CustomSinCurve( 1.0 );
var geometry = new THREE.TubeGeometry( path, 20, 0.2, 8, false );
//var geometry=new THREE.SphereGeometry( ballRadius, 14, 10 );
var ball = new THREE.Mesh( geometry, ballMaterial );
ball.castShadow = true;
ball.receiveShadow = true;
var ballShape = createTriangleShapeByGeometry(geometry);//new Ammo.btSphereShape( ballRadius );
ballShape.setMargin( margin );
var pos = new THREE.Vector3();
var quat = new THREE.Quaternion();
pos.copy( raycaster.ray.direction );
pos.add( raycaster.ray.origin );
quat.set( 0, 0, 0, 1 );
var ballBody = createRigidBody( ball, ballShape, ballMass, pos, quat );
pos.copy( raycaster.ray.direction );
pos.multiplyScalar( 24 );
ballBody.setLinearVelocity( new Ammo.btVector3( pos.x, pos.y, pos.z ) );
管道Factory代码:
function CustomSinCurve( scale ) {
THREE.Curve.call( this );
this.scale = ( scale === undefined ) ? 1 : scale;
}
CustomSinCurve.prototype = Object.create( THREE.Curve.prototype );
CustomSinCurve.prototype.constructor = CustomSinCurve;
CustomSinCurve.prototype.getPoint = function ( t ) {
var tx = t * 3 - 1.5;
var ty = Math.sin( 2 * Math.PI * t );
var tz = 0;
return new THREE.Vector3( tx, ty, tz ).multiplyScalar( this.scale );
};
Demo:
点击体验3D物理引擎bullet的javascript版本。源码参考了:https://github.com/THISISAGOODNAME/learn-ammojs,感谢原作者!
(正文完!)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- win10 专业版 提示开机提示你的windows许可证即将过期
- 浅谈文件上传漏洞(其他方式绕过总结)
- 《sql必知必会》——读书笔记(1)
- JDK15已发布,网友:我还在JDK8踏步走...
- 树莓派基础实验15:电位器传感器实验
- java JDBC数据库连接池技术(Druid ,c3p0)
- Fail to start qos server: dubbo version: current host: java.net.BindException:
- JAVA JDBC Template的使用
- 《sql必知必会》——读书笔记(2)
- 2.通过QOpenGLWidget绘制三角形
- 树莓派基础实验16:霍尔传感器实验
- 1.opengl绘制三角形
- dubbo本地直连调试注意点
- Tomcat的使用及服务器的一些基础知识
- fastJson 之JSONObject.toJavaObject()方法不能解析嵌套自定义list对象