ThreeJS. How to implement ZoomALL and make sure a given box fills the canvas area?

放肆的年华 提交于 2019-12-06 07:56:49

问题


I am looking for a function to ensure that a given box or sphere will be visible in a WebGL canvas, and that it will fit the canvas area. I am using a perspective camera and the camera already points to the middle of the object. I understand that this could be achieved by changing the FOV angle or by moving the camera along the view axis.

Any idea how this could be achieved with ThreeJS ?


回答1:


This is how I finally implemented it:

var camera = new THREE.PerspectiveCamera(35,1,1, 100000);
var controls = new THREE.TrackballControls( me.camera , container);
[...]


/**
 * point the current camera to the center
 * of the graphical object (zoom factor is not affected)
 *
 * the camera is moved in its  x,z plane so that the orientation 
 * is not affected either
 */
function pointCameraTo (node) {

    var me = this;

    // Refocus camera to the center of the new object
    var COG = shapeCenterOfGravity(node);

    var v = new THREE.Vector3();
    v.subVectors(COG,me.controls.target);

    camera.position.addVectors(camera.position,v);

    // retrieve camera orientation and pass it to trackball  
    camera.lookAt(COG);
    controls.target.set( COG.x,COG.y,COG.z );  

};

/**
 *  Zoom to object
 */
function zoomObject (node) {

   var me = this; 

   var bbox = boundingBox(node);
   if (bbox.empty()) {
       return;
   }
   var COG =  bbox.center();

   pointCameraTo(node);

   var sphereSize = bbox.size().length() * 0.5;
   var distToCenter = sphereSize/Math.sin( Math.PI / 180.0 * me.camera.fov * 0.5);

   // move the camera backward 

   var target = controls.target;
   var vec = new THREE.Vector3();
   vec.subVectors( camera.position, target );
   vec.setLength( distToCenter );
   camera.position.addVectors(  vec , target );
   camera.updateProjectionMatrix();
   render3D();
};

An example of this can be seen in https://github.com/OpenWebCAD/node-occ-geomview/blob/master/client/geom_view.js




回答2:


Here is how I did it { Using TrackBall to Zoomin/out pan etc }

function init(){
......
......
controls = new THREE.TrackballControls(camera);

controls.rotateSpeed = 1.0;
controls.zoomSpeed = 1.2;
controls.panSpeed = 0.8;

controls.noZoom = false;
controls.noPan = false;

controls.staticMoving = true;
controls.dynamicDampingFactor = 0.3;

controls.keys = [65, 83, 68];

controls.addEventListener('change', render);

.....
.....
render(scene, camera);
animate();
}
function render() 

{
    renderer.render(scene, camera);
    //stats.update();
}

function animate() {
    requestAnimationFrame(animate);
    controls.update();
}


来源:https://stackoverflow.com/questions/15761644/threejs-how-to-implement-zoomall-and-make-sure-a-given-box-fills-the-canvas-are

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!