Three.js全屏问题
Three.js全屏问题
我阅读了Three.js的API,也在StackOverflow上阅读了相关问题,我使用firebug和chrome的调试器调试了代码,我尽可能地剥离了所有东西,但我仍然遇到这个令人烦恼的全屏错误,渲染器视口比我的屏幕大,因此出现了滚动条。这是一个可见的错误,不会影响渲染或其他操作,我只是想控制视口的大小,使其与可用的屏幕空间匹配,而不会出现滚动条。
我在Windows 7上使用Google Chrome 18,刚开始使用Three.js API,但我以前使用过OpenGL等图形API,所以并不陌生。
当我尝试运行这段代码(这是在github主页上显示的默认示例)时:
var camera, scene, renderer, geometry, material, mesh; init(); animate(); function init() { scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 10000 ); camera.position.z = 1000; scene.add( camera ); geometry = new THREE.CubeGeometry( 200, 200, 200 ); material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } ); mesh = new THREE.Mesh( geometry, material ); scene.add( mesh ); renderer = new THREE.CanvasRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); } function animate() { // 注意:three.js包含requestAnimationFrame shim requestAnimationFrame( animate ); render(); } function render() { mesh.rotation.x += 0.01; mesh.rotation.y += 0.02; renderer.render( scene, camera ); }
它正常渲染,我可以看到红色线框盒子旋转,但我注意到渲染器的视口太大了,比我的屏幕尺寸要大,导致出现了滚动条。代码使用window.innerWidth
和window.innerHeight
来设置宽高比和渲染器的宽度/高度,但似乎它在页面的底部和右侧添加了额外的20到30个像素?
我尝试调整body元素的CSS来去除边距和填充,对于创建的canvas元素也是如此,但没有用。我将屏幕尺寸打印到页面上,并使用JavaScript的alert()
函数来检查窗口的宽度和高度,然后观察它们在运行时操作期间传递给Three.js API,但错误仍然存在:canvas渲染对象自动调整大小,比屏幕稍大。我接近解决问题的方法是这样的:
var val = 7; // 减去val来调整窗口大小 function get_width(){return window.innerWidth - val;} function get_height(){return window.innerHeight - val;} //... 代码省略 camera = new THREE.PerspectiveCamera( 75, get_width() / get_height(), 1, 10000 ); //... 代码省略 render.setSize(get_width(), get_height());
它可以将渲染器的大小调整到窗口的边界内,但只有到一定程度。如果我将val
降低到小于7,例如6或更少,渲染器的大小会再次增加20像素(大约),比屏幕更大,导致出现滚动条?
有什么想法或建议吗?