Three.js - 相机的 Z 轴距离适合盒子的全视图
Three.js - Good z distance of camera for full view of box
我用 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 盒子大小的完整视图?
可能我混淆了场景的大小和我的盒子的大小
谢谢
您想计算相机位置以便获得盒子的完整视图。
如 this post 中所述,您可以根据与相机的距离计算可见高度,如下所示:
var vFOV = camera.fov * Math.PI / 180; // convert vertical fov to radians
var height = 2 * Math.tan( vFOV / 2 ) * dist; // visible height
重要的是立方体正面的可见性。
在您的例子中,正面的高度为 500,并且由于立方体以原点为中心,因此立方体的正面位于原点前方 250 的距离处。所以,重写上面的公式,
var dist = 500 / ( 2 * Math.tan( camera.fov * Math.PI / 360 ) );
由于相机必须从正面,
camera.position.set( 0, 0, 250 + dist );
这是使正方体"fit"处于可见高度的精确解。从那里,您可以根据自己的喜好调整相机位置。或者,您可以通过在上面的公式中为 height
使用稍大的值来确保边距。
three.js r.71
我用 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 盒子大小的完整视图?
可能我混淆了场景的大小和我的盒子的大小
谢谢
您想计算相机位置以便获得盒子的完整视图。
如 this post 中所述,您可以根据与相机的距离计算可见高度,如下所示:
var vFOV = camera.fov * Math.PI / 180; // convert vertical fov to radians
var height = 2 * Math.tan( vFOV / 2 ) * dist; // visible height
重要的是立方体正面的可见性。
在您的例子中,正面的高度为 500,并且由于立方体以原点为中心,因此立方体的正面位于原点前方 250 的距离处。所以,重写上面的公式,
var dist = 500 / ( 2 * Math.tan( camera.fov * Math.PI / 360 ) );
由于相机必须从正面,
camera.position.set( 0, 0, 250 + dist );
这是使正方体"fit"处于可见高度的精确解。从那里,您可以根据自己的喜好调整相机位置。或者,您可以通过在上面的公式中为 height
使用稍大的值来确保边距。
three.js r.71