IFE2017,WebGL-08 物理引擎——使用Physijs遇到的几个坑

  • 加载的外部模型没有物理特性

因为physijs自身没有加载模块,所以加载的时候需要用physijs的方法拷贝外部模型

var objLoader = new THREE.OBJLoader();

objLoader.load('xxx.obj',function(object){
  var model = object;

  for (let x in model.children){
    let material = Physijs.createMaterial(
      model.children[x].material,
      1,
      0
    );
    let mesh = new Physijs.BoxMesh(
      model.children[x].geometry,
      material,
      0
    );
    mesh.castShadow = true;
    mesh.receiveShadow = true;

    scene.add(mesh);
  }
},onProgress,onError);

<br />

  • 不能同时向场景加入多个元素

scene.add(obj1,obj2)
原本three.js是支持这样的做法的,但是physijs中这种写法只会加载第一个元素
<br />

  • 直接改变元素的位置或角度时必须要设置参数

// Change the object's position
mesh.position.set( 0, 0, 0 );
mesh.__dirtyPosition = true;

// Change the object's rotation
mesh.rotation.set(0, 90, 180);
mesh.__dirtyRotation = true;

推荐的做法是给物体一个线速度或者角速度

// use linear velocity to change rotation
mesh.setLinearVelocity(new THREE.Vector3(0, 0, 1));

// use angular velocity to change rotation
mesh.setAngularVelocity(new THREE.Vector3(0, 1, 0));

但是这有个问题,直接改变的做法动画是很流畅的,但是用速度矢量画面会有一顿一顿的情况,暂未能解决。
<br />

  • 直接改变角度无法超过90度

直接解决的办法还没找到,用角速度的方法是没问题的。
相关issue:issue137issue170

监控物体的rotation可以发现在y在90度附近时rotation的x和z在-PI,0,PI之间反复变动的情况

此外根据issue223中jimver04的回复我尝试把fixedTimeStep改成1/20,结果是可以超过90度了,但是时不时会出现物体翻转的情况。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,842评论 1 92
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,002评论 25 709
  • 今晚学生跟我说,十月份的时候还有一笔钱没报销。当时很生气。这么久没汇报,现在突然说还有钱没报。我问他有多少钱还没到...
    大书没长大阅读 160评论 0 0
  • 这是个带着五仁味儿的故事。 我有个很特别的朋友,她叫小夕。 小夕和妈妈约好了明天要一起吃晚饭。可是不久后却得知明天...
    浮生非常闲阅读 141评论 0 0
  • 一天的佛寺探寻终于尘埃落定,拖着疲惫的身躯躺在床上,仍然是思绪万千,佛法无边,怎是我这一介凡夫俗子所能透彻透悟的...
    ly啦啦啦阅读 232评论 2 4