THREE.JS-OBJ + MTL上用于碰撞检测的Raycaster性能(FirstPersonControls.js)

时间:2019-07-25 09:59:34

标签: javascript three.js raycasting

这是OBJ + MTL(用作纹理)的上载

var ambientLight = new THREE.AmbientLight(0xf0f0f0, '.$dbData['light_drone'].');
        scene.add(ambientLight);

          var modelloOBJ;
          var fileMTL = "./Uploads/'.$dbData['id'].'/Drone/";
          console.log("fileMTL", fileMTL);
          var mtlLoader = new THREE.MTLLoader();
          mtlLoader.setTexturePath(fileMTL);
          mtlLoader.setPath(fileMTL);
          mtlLoader.load("'.$dbData['file_drone'].'.mtl", function( materials ) {
            materials.preload();
            var loader = new THREE.OBJLoader();
            loader.setMaterials(materials);
            loader.load(fileMTL+"'.$dbData['file_drone'].'"+".obj", function ( modello ) {
              modelloOBJ = modello;
              modello.rotateOnWorldAxis(new THREE.Vector3(1,0,0), Math.PI * 3 / 2);
              new THREE.Vector3(1,0,0);
              scene.add(modello);
              document.getElementById("ProgressCircle").style.visibility = "hidden";

              modelloOBJ.boundingBox = (new THREE.Box3()).setFromObject(modello);
              camera.lookAt(modelloOBJ.position); //
              var vmax =modelloOBJ.boundingBox.max;
              var vmin = modelloOBJ.boundingBox.min;
              var centroX = ( vmax.x + vmin.x )/2;
              var centroY = vmin.y;
              var centroZ = ( vmax.z + vmin.z )/2;


            },

这些是光线投射器(S)


  function animate() {

 var delta = clock.getDelta();

 controls.update(delta);

 var vector = new THREE.Vector3(0,-1,0);


vector = camera.localToWorld(vector);
vector.sub(camera.position);

var raycaster = new THREE.Raycaster(camera.position,vector);

var intersects = raycaster.intersectObjects(scene.children, true);


 if (intersects.length > 0) {

 console.log(intersects[0].distance);

    if(intersects[0].distance<1.21){

    camera.position.y=(camera.position.y+(1.21-intersects[0].distance));

  }

  if(intersects[0].distance>1.36&&intersects[0].distance<1.45){

    camera.position.y=(camera.position.y-(intersects[0].distance-1.215));

  }

}


 var vector1 = new THREE.Vector3(0,0,-1);

vector1 = camera.localToWorld(vector1);
vector1.sub(camera.position);

var raycaster1 = new THREE.Raycaster(camera.position,vector1);

var intersects1 = raycaster1.intersectObjects(scene.children, true);

 if (intersects1.length > 0) {

  console.log(intersects1[0].distance);
 if(intersects1[0].distance<0.3){
  controls.moveForward=false;
  controls.w=false;
 }else{
  controls.w=true;
 }
THREE.Vector3(intersects[0].point.x,intersects[0].point.y,intersects[0].point.z);

}else controls.w=true;

    stats.update(renderer);

console.log(stats.domElement.firstChild.childNodes["0"].innerHTML);
    requestAnimationFrame( animate );
    renderer.render( scene, camera );
    console.log(renderer.info.render.faces);
  }

  animate();

问题:当我将光线投射添加到代码中时,性能会大大下降。从60 fps到20 fps。

我尝试过的另一件事是

var l=1;

  function animate() {

     var delta = clock.getDelta();

    controls.update(delta);

if (l%5==0)
{
  var vector = new THREE.Vector3(0,-1,0);

vector = camera.localToWorld(vector);
vector.sub(camera.position);

var raycaster = new THREE.Raycaster(camera.position,vector);

var intersects = raycaster.intersectObjects(scene.children, true);


 if (intersects.length > 0) {

 console.log(intersects[0].distance);

    if(intersects[0].distance<1.21){

    camera.position.y=(camera.position.y+(1.21-intersects[0].distance));

  }

  if(intersects[0].distance>1.36&&intersects[0].distance<1.45){

    camera.position.y=(camera.position.y-(intersects[0].distance-1.215));

  }

}

var vector1 = new THREE.Vector3(0,0,-1);

vector1 = camera.localToWorld(vector1);
vector1.sub(camera.position);

var raycaster1 = new THREE.Raycaster(camera.position,vector1);

var intersects1 = raycaster1.intersectObjects(scene.children, true);


 if (intersects1.length > 0) {

  console.log(intersects1[0].distance);
 if(intersects1[0].distance<0.3){
  controls.moveForward=false;
  controls.w=false;
 }else{
  controls.w=true;
 }

THREE.Vector3(intersects[0].point.x,intersects[0].point.y,intersects[0].point.z);

}else controls.w=true;
}


    stats.update(renderer);

    requestAnimationFrame( animate );
    renderer.render( scene, camera );
    console.log(renderer.info.render.faces);
   l=l+1;

  }

  animate();

在这种情况下,它们每五次调用动画函数执行一次。

fps从20变为35。但这是低效的,因为我使用光线投射器在墙壁和地面上进行碰撞。

模型的大小小于20mb。另外,当raycaster无法正常工作时,该模型可以保持60fps的速度而不会出现任何下降。

请记住,我需要在模型中进行碰撞。

是否有改善性能的方法? 也许我不应该使用raycaster吗?

P.S。控件是FirstPersonControls.js,我对此做了一些修改。

0 个答案:

没有答案