【问题标题】:Resizing view in three.js shrinks image在 three.js 中调整视图大小会缩小图像
【发布时间】:2016-09-08 01:25:45
【问题描述】:

我正在尝试创建一个在线 3D 操作工具。我已经用旋转立方体和网格设置了我的 THREE.js 视图。当我运行代码时,它可以 100% 正常工作,但是如果我调整视图大小,它不会用它调整 THREE.js 屏幕。 (它会根据浏览器视图的变化来缩小场景的长度或宽度。)导致视图看起来失真。

$(function(){
	
	var scene = new THREE.Scene();
	var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, .1, 500);
	var renderer = new THREE.WebGLRenderer();
	
	renderer.setClearColor(0xdddddd);
	renderer.setSize(window.innerWidth, window.innerHeight);
	renderer.shadowMap.enabled = true;
	renderer.shadowMapSoft = true;
	
	var axis = new THREE.AxisHelper(10);
	scene.add(axis);
	
	var color = new THREE.Color("rgb(255,0,0)");
	var color2 = new THREE.Color(0xd3d3d3);
	var grid = new THREE.GridHelper(50, 15, color, color2);
	
	scene.add(grid);
	
	var cubeGeometry = new THREE.BoxGeometry(5, 5, 5);
	var cubeMaterial = new THREE.MeshLambertMaterial({color: 0xff3300});
	var cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
	
	/*var planeGeometry = new THREE.PlaneGeometry(30, 30, 30);
	var planeMaterial = new THREE.MeshLambertMaterial({color: 0xffffff});
	var plane = new THREE.Mesh(planeGeometry, planeMaterial);
	
	plane.rotation.x = -.5*Math.PI;
	plane.position.y = -.1
	plane.recieveShadow = true;
	
	scene.add(plane);*/
	
	cube.position.x = 2.5;
	cube.position.y = 4;
	cube.position.z = 2.5;
	cube.castShadow = true;
	
	scene.add(cube);
	
	var spotLight = new THREE.SpotLight(0xffffff);
	spotLight.castShadow = true;
	spotLight.position.set(15, 30, 50);
	
	scene.add(spotLight);
	
	camera.position.x = 40;
	camera.position.y = 40;
	camera.position.z = 40;
	
	camera.lookAt(scene.position);
	
	var guiControls = new function(){
		this.rotationX = 0.01;
		this.rotationY = 0.01;
		this.rotationZ = 0.01;
	}
	
	var datGUI = new dat.GUI();
	datGUI.add(guiControls, 'rotationX', 0, 1);
	datGUI.add(guiControls, 'rotationY', 0, 1);
	datGUI.add(guiControls, 'rotationZ', 0, 1);
	
	render();
	function render() {
        //Me trying to reset the camera view every render
		camera.fov = 45
		camera.aspect = window.innerWidth / window.innerHeight
		camera.near = .1
		camera.far = 500
		scene.add(camera);
		cube.rotation.x += .1;
		renderer.setSize(window.innerWidth, window.innerHeight);
		requestAnimationFrame(render);
		renderer.render(scene, camera);
	}
	
	$("#world").append(renderer.domElement);
	renderer.render(scene, camera);
});

【问题讨论】:

    标签: javascript jquery html three.js


    【解决方案1】:

    在您的代码中添加一个事件监听器来处理调整大小:

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

    然后:

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

    或者,由于您使用的是 jQuery,您可以添加以下代码:

    $( window ).resize(function() {
        w = window.innerWidth;
        h = window.innerHeight;
        camera.aspect = w / h;
        camera.updateProjectionMatrix();
        renderer.setSize( w, h );
    });
    

    Click here 看到一个工作的codePen。

    【讨论】:

    • onWindowResize 没有定义?
    • 您是否在与事件侦听器相同的范围内定义了该函数?我也用 jQuery 替代品编辑了我的答案。
    • @MatthewAnderson,我已经在我的答案中添加了一个工作代码笔,请查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2015-07-16
    • 2016-08-13
    • 1970-01-01
    相关资源
    最近更新 更多