Three.js 调整大小 window 缩放不正确

Three.js resize window not scaling properly

调整 window 大小时,形状无法正确缩放。

我正在使用以下代码,根据文档,它应该没问题。

var camera, controls, scene, renderer, viewSize;
        scene = new THREE.Scene();
scene.background = new THREE.Color( 0xffffff );
viewSize = 20;
var aspectRatio = window.innerWidth / window.innerHeight
camera = new THREE.OrthographicCamera( -aspectRatio * viewSize /  2, aspectRatio * viewSize / 2, viewSize / 2, -viewSize /  2, 0.1, 1000 );
camera.position.x = 10;
camera.position.y = 10;
camera.position.z = -10
camera.lookAt(scene.position);

renderer = window.WebGLRenderingContext ? new THREE.WebGLRenderer() : new THREE.CanvasRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

controls = new THREE.OrbitControls( camera , renderer.domElement);

window.addEventListener( 'resize', onWindowResize, false );

function onWindowResize() {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize( window.innerWidth , window.innerHeight);
}

makeShapes();

var render = function () {
  requestAnimationFrame( render );
  renderer.render(scene, camera);
};

render();

如上图所示,当 window 变大时形状会被拖出,反之亦然。

试试这个:

var w = window.innerWidth;
var h = window.innerHeight;
var viewSize = 20;

var camera, scene, renderer;

camera = new THREE.OrthographicCamera( w / - 2 * viewSize, w / 2 * viewSize, h / 2 * viewSize, h / - 2 * viewSize, 0.1, 1000 );
camera.position.set( 10, 10, -10 );
camera.lookAt( scene.position );

renderer = window.WebGLRenderingContext ? new THREE.WebGLRenderer() : new THREE.CanvasRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

window.addEventListener( 'resize', onWindowResize, false );

function onWindowResize() {
    w = window.innerWidth;
    h = window.innerHeight;
    camera.left = w / - 2 * viewSize;
    camera.right = w / 2 * viewSize;
    camera.top = h / 2 * viewSize;
    camera.bottom = h / - 2 * viewSize;
    camera.updateProjectionMatrix();
    renderer.setSize( w, h );
}

问题已通过按 window 大小按比例重新调整相机的左、右、上和下参数来解决。现在对象得到它的 viewSize 并根据对 window 大小所做的更改重新调整大小。

var camera, scene, renderer;
var originalAspect;

scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);

var viewSize = 20;
var aspectRatio = window.innerWidth / window.innerHeight;
originalAspect = window.innerWidth / window.innerHeight;
camera = new THREE.OrthographicCamera(-aspectRatio * viewSize / 2, aspectRatio * viewSize / 2, viewSize / 2, -viewSize / 2, 0.1, 1000);
camera.position.set( 10, 10, -10 );
camera.lookAt(scene.position);

renderer = window.WebGLRenderingContext ? new THREE.WebGLRenderer() : new THREE.CanvasRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var controls = new THREE.OrbitControls(camera, renderer.domElement);

window.addEventListener('resize', onWindowResize, false);

function onWindowResize() {
    var aspect = window.innerWidth / window.innerHeight;
    var change = originalAspect / aspect;
    var newSize = viewSize * change;
    camera.left = -aspect * newSize / 2;
    camera.right = aspect * newSize  / 2;
    camera.top = newSize / 2;
    camera.bottom = -newSize / 2;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
}