【发布时间】:2015-10-24 10:22:31
【问题描述】:
我用 Three.js 显示一个大小为 700x700 的场景。在这个场景中,我生成了一个粒子系统,其随机位置在 -250 到 250 之间(对于 x、y、z),因此框的大小为 500x500。
为了计算相机的正确距离(对于盒子的完整视图),我尝试了:
<script>
if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
var container, stats;
var camera, controls, scene, renderer;
var cross;
var width = 700, height = 700;
init();
animate();
function init() {
camera = new THREE.PerspectiveCamera( 60, width / height, 1, 1000 );
// tan(pi/6) = 1/sqrt(3) = height/2 / distance_z
camera.position.z = 250*Math.sqrt(3);
...
for(var p = 0; p < particleCount; p++) {
// create a particle with random
// position values, -250 -> 250
var pX = 250 - Math.random() * 500;
var pY = 250 - Math.random() * 500;
var pZ = 250 - Math.random() * 500;
var particle = new THREE.Vector3(pX, pY, pZ);
// add it to the geometry
geometry.vertices.push(particle);
}
function onWindowResize() {
camera.aspect = width /height;
camera.updateProjectionMatrix();
renderer.setSize( width, height );
controls.handleResize();
}
...
</script>
如您所见,我将这个公式应用于视野 (FOV)
tan(FOV/2) == height/2 / distance_z
这里给出:distance_z = 250 * sqrt(3)
但是当我加载页面时,缩放似乎太高了,我离 500x500 框太近了。
为什么这个计算在我的情况下不正确?以及如何获得完全适合我的 500x500 框大小的完整视图?
也许我混淆了场景的大小和我的盒子的大小
谢谢
【问题讨论】:
-
我使用
6 * geometry.boundingSphere.radius作为距离。当然,如果你的相机位置 x 和 z 不为 0,那么这个值对于 z 来说太高了。这是一个假设的几何形状(你的“盒子”)。所以这段代码不会直接为你工作,因为你会发现需要找到你的盒子的边界球。
标签: javascript three.js perspectivecamera