我知道这个问题已经得到解答,但我想提交一些东西以供后代考虑,以及跟随我们步骤的人的沮丧程度。
Three.js 使用相机对象来提供 3d 场景的视图。我主要使用透视相机(而不是正交相机,如果您使用的是正交相机,抱歉目前无法帮助您。),我碰巧偶然发现了您正在讨论的问题的解决方案. 透视图在创建时采用某些参数:
- fov(确定垂直视野的角度
- 纵横比(宽度/高度值)<--重要!
- 近剪裁平面(当对象足够接近以被视为“在”相机镜头“后面”时的标量值,因此不再可见)
- 远剪裁平面(当对象距离足够远以被认为对相机不可见时的标量值
由于浏览器窗口是您的视口,因此我们通常使用浏览器窗口属性来设置相机的纵横比。由于这些属性将相机设置为正确渲染(如果视口大小和相机/渲染器设置不匹配,您的图像将出现粉碎/挤压/扭曲,如果它出现的话),如果浏览器窗口被调整大小相机值不再匹配相机用于渲染场景的值。
正如 Juan Mellado 所指出的,您可以使用该renderer.setSize(w,h)
方法更改视口的大小。如果您希望窗口调整大小更改也更新渲染器和相机,请执行以下操作:
function onResize()
{
var width, height;
width = window.innerWidth; // for example
height = window.innerHeight; // for example
//First update the camera's aspect ratio: width / height
camera.aspect = width/height;
//Whenever you make a change to the camera,
//you must update for your changes to take effect
camera.updateProjectionMatrix();
//Here we reset the size of the window to the new height
renderer.setSize(width, height);
}
现在我们已经声明了一个可以处理更新相机和渲染器的回调函数,不要忘记将它绑定到 window.resize 事件。我只是使用 jQuery 来做到这一点:
jQuery(window).resize(onResize);
或者
window.onresize = onResize;
回顾:
1.) 用于计算相机纵横比的值必须与作为渲染器大小值传递的值相匹配。
2.) 如果您希望相机纵横比和渲染器大小值随浏览器大小缩放,则必须将回调函数绑定到 window.onresize 事件来执行此操作。
3.) 如果您对相机进行更改,在创建后,您必须调用“updateProjectionMatrix()”来更新相机的内部值,以便您的更改生效。
如果一切顺利,当您更改窗口大小时,相机纵横比和渲染器大小将自动随窗口大小缩放。
干杯和快乐的编码!