这是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,我对此做了一些修改。