由于我以前没有3D方面的经验,因此遇到了一些问题,这些问题可能是3D pro的常识;)。
我有各种各样的场景尺寸(800x600、1200x100等)。
我可以使用什么公式来确保z位置为0且宽度和高度与场景相同的对象填满整个场景。
例如:对象网格A为1200x100,并且在Z位置0上。场景也为1200x100。 相机位于z位置1500。什么是使物体充满场景的FOV?
我正在寻找((A / B)* C)的东西:D。
凡是足以回答我的问题的人,都可以说无数的荣誉:)
给定垂直视野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不是有效距离?
您可能会在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;
通过这种方式也可以处理高度>宽度等情况...
最有用的评论
给定垂直视野
vFOV
和到相机dist
的可见height
dist
是可见的
width
是THREE.js中相机的视野参数是垂直的。
使用两组方程式两次计算所需的vFOV,然后选择较大的答案。