Three.js: 计算透视相机的FOV

创建于 2012-02-02  ·  19评论  ·  资料来源: mrdoob/three.js

由于我以前没有3D方面的经验,因此遇到了一些问题,这些问题可能是3D pro的常识;)。
我有各种各样的场景尺寸(800x600、1200x100等)。
我可以使用什么公式来确保z位置为0且宽度和高度与场景相同的对象填满整个场景。

例如:对象网格A为1200x100,并且在Z位置0上。场景也为1200x100。 相机位于z位置1500。什么是使物体充满场景的FOV?

我正在寻找((A / B)* C)的东西:D。

凡是足以回答我的问题的人,都可以说无数的荣誉:)

Question

最有用的评论

给定垂直视野vFOV和到相机dist的可见height dist

height = 2 * Math.tan( ( vFOV / 2 ) ) * dist;

可见的width

aspect = window_width / window_height;
hFOV = 2 * Math.atan( Math.tan( vFOV / 2 ) * aspect );
width  = 2 * Math.tan( ( hFOV / 2 ) ) * dist;

THREE.js中相机的视野参数是垂直的。

使用两组方程式两次计算所需的vFOV,然后选择较大的答案。

所有19条评论

给定垂直视野vFOV和到相机dist的可见height dist

height = 2 * Math.tan( ( vFOV / 2 ) ) * dist;

可见的width

aspect = window_width / window_height;
hFOV = 2 * Math.atan( Math.tan( vFOV / 2 ) * aspect );
width  = 2 * Math.tan( ( hFOV / 2 ) ) * dist;

THREE.js中相机的视野参数是垂直的。

使用两组方程式两次计算所需的vFOV,然后选择较大的答案。

非常感谢您的回复:)
我有点困惑。 我从哪里获得变量vFOV?
是应该填充场景的物体的高度吗?
如果是这样,我会得到怪异的数字(在1000范围内),那么我该如何将其转换为最终的FOV。

我创建了一个小提琴http://jsfiddle.net/dmYgr/6/
你能告诉我那里怎么做吗?

再次感谢您。 从您的帖子中,我已经可以感觉到您比我更是个天才;)

使用第一个方程式求解vFOV ,然后将其用作相机的fov参数。

我的场景是800 * 600。
相机的距离是1000。

如何在您的公式中使用这些数字。
我不知道在vFOV中填写什么。

高度= 2 * Math.tan((vFOV / 2))* dist; <-您正在告诉我从这里开始,但是应该用什么数字代替vFOV?

使用第一个方程式,像这样求解vFOV

vFOV = 2 * Math.atan( height / ( 2 * distance ) );

然后将其用作相机的fov参数。

var renderWidth = 800;
var renderHeight = 600;
var cameraPosition = 1000;
var vFOV = 2 * Math.atan( renderWidth / ( 2 * cameraPosition ) );
var height = 2 * Math.tan( ( vFOV / 2 ) ) * cameraPosition;
var aspect = renderWidth / renderHeight;
var hFOV = 2 * Math.atan( Math.tan( vFOV / 2 ) * aspect );
var width  = 2 * Math.tan( ( hFOV / 2 ) ) * cameraPosition;

结果:
vFOV = 0.7610127542247298这不是有效的FOV

var vFOV = 2 * Math.atan( renderHeight / ( 2 * cameraPosition ) );
var height = 2 * Math.tan( ( vFOV / 2 ) ) * cameraPosition;

var aspect = renderWidth / renderHeight;
var hFOV = 2 * Math.atan( Math.tan( vFOV / 2 ) * aspect );
var width  = 2 * Math.tan( ( hFOV / 2 ) ) * cameraPosition;

vFOV = 0.5829135889557342这也不是有效的FOV

您能为我填写示例并显示给出有效FOV编号的示例吗?
上面示例的正确数字在37左右

在你的小提琴中

高度=平面网格的高度= 500。

距离= camera.z-plane.z = 1000-100 = 900。

vFOV = 2 * Math.atan(height /(2 * distance))= 0.5419弧度,或31.04度。

根据我的浏览器,2 * Math.atan(500 /(2 * 900))= 0.5418937006768411

抱歉,我忽略了显示弧度到度的转换。 我更新了我以前的帖子。

非常感谢! :D
嗯,它收到了大约10条回复,但现在可以使用了:)。
再次感谢!

@Tobiasartz :-)

西兰利。 你是国王谢谢。

这超级有帮助! 谢谢@WestLangley

谢谢@WestLangley !!
因为花了我一段时间才意识到我需要添加从辐射度到度的转换,所以我在这里添加了一个带有最终代码的示例:

var distance = 1000;
var FOV = 2 * Math.atan( window.innerHeight / ( 2 * distance ) ) * 180 / Math.PI;
var camera = new THREE.PerspectiveCamera( FOV, window.innerWidth/window.innerHeight, 0.1, distance );
camera.position.z = distance;

@ Emanuele-Spatola您的公式没有意义。 window.innerHeight具有像素单位。 distance最有可能不会。 可见高度必须与距离相同。

我用该公式更新了Tobiasartz的小提琴,它似乎起作用了:
http://jsfiddle.net/dmYgr/63/
画布为500px,平面为495x495,边框周围约有5px。
为什么1000px不是有效距离?

http://jsfiddle.net/dmYgr/65/

为什么1000px不是有效距离?

您是否曾经将相机放置在被摄物体前方1000像素处?

您可能会在10英尺远的地方放置一台真正的相机,以观察10英尺宽的场景。 同样,您可以将虚拟相机放置在1000px外,以查看1000px宽的场景。

当我知道镜头的高度,场景宽度和距离时,才使用此功能...

var distance = 1000,height=window.innerHeight,width=window.innerWidth
var diag = Math.sqrt((height*height)+(width*width))
var FOV = 2 * Math.atan( diag / ( 2 * distance ) ) * 180 / Math.PI;
var camera = new THREE.PerspectiveCamera( FOV, window.innerWidth/window.innerHeight, 0.1, distance );
camera.position.z = distance;

通过这种方式也可以处理高度>宽度等情况...

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

scrubs picture scrubs  ·  3评论

yqrashawn picture yqrashawn  ·  3评论

zsitro picture zsitro  ·  3评论

Bandit picture Bandit  ·  3评论

donmccurdy picture donmccurdy  ·  3评论