Javascript 如何定位相机,使对象在屏幕上始终具有相同的像素宽度和高度?

Javascript 如何定位相机,使对象在屏幕上始终具有相同的像素宽度和高度?,javascript,math,three.js,geometry,Javascript,Math,Three.js,Geometry,我有一个问题我不知道如何去解决,也许有人可以给我一个如何解决它的提示 我希望相机被定位在一个z索引,这将导致立方体显示在完全相同的像素宽度和高度,无论窗口的大小或纵横比是什么。立方体的z位置为0。摄像机需要放在后面看这个立方体 因此,当用户看到屏幕显示时,用户应该看到立方体在屏幕上具有完全相同的像素宽度和高度。现在我猜相机的z位置一定是窗口宽度、高度、纵横比和常数的函数 如何计算A、B、C和D?我怀疑这是一个几何问题,但我不知道如何着手解决它。也许我需要添加一个约束,即对象应该具有完全相同的宽度

我有一个问题我不知道如何去解决,也许有人可以给我一个如何解决它的提示

我希望相机被定位在一个z索引,这将导致立方体显示在完全相同的像素宽度和高度,无论窗口的大小或纵横比是什么。立方体的z位置为0。摄像机需要放在后面看这个立方体

因此,当用户看到屏幕显示时,用户应该看到立方体在屏幕上具有完全相同的像素宽度和高度。现在我猜相机的z位置一定是窗口宽度、高度、纵横比和常数的函数

如何计算A、B、C和D?我怀疑这是一个几何问题,但我不知道如何着手解决它。也许我需要添加一个约束,即对象应该具有完全相同的宽度和高度(像素匹配100像素宽和100像素高)

var aspectRatio = window.innerWidth / window.innerHeight;
var camera = new PerspectiveCamera( 60.0, aspectRatio, 1.0, 10000.0 );

var A = 1.0;
var B = 1.0;
var C = 1.0;
var D = 1.0;
camera.position.z = A * window.innerWidth + B * window.innerHeight +
                    (C * aspectRatio) + D;
var geometry = new CubeGeometry( 100.0, 100.0, 0.0001 );

更新后,我通过反复试验解决了这个问题

我不懂这个的几何学,也不懂这个的数学,但我注意到物体的大小取决于窗户的高度,而不是窗户的宽度。同样,我不知道为什么,但是当我调整高度时,对象变大或变小,但当我调整宽度时,对象保持不变

所以我决定高度很可能是决定函数的一个元素,然后我通过改变值进行反复试验,直到得到正确的大小,100×100像素的大小。然后我改变了高度,它的大小保持不变。我很高兴我有了这个结果

num A = 0.0;
num B = -0.867;
num C = 0.0;
num D = 0.0;

在您的情况下,更可能依赖于较小的窗口大小轴!!!因为纵横比方程通常在不同的情况下有所不同:

  • 宽度>高度
  • width
  • 大多数渲染都是从OpenGL中获取此行为的,因此,如果要完整,您的代码可能需要添加一个
    :)
    。当然,只需调整窗口的大小,使其高度大于宽度,然后看看会发生什么

    顺便说一句。后面的数学只是简单的三角形数学,如下所示:

    一个角度为90度,第二个角度为90度

    atan (h1/z1) = atan (h0/z0)
    h1/z1 = h0/z0   <- triangle similarity
    z1 = z0*h1/h0   <- this is what you want
    

    请参阅“我不理解这个的几何结构或数学…”:这是因为透视摄影机的第一个参数是垂直视野。看。已经解决了,但无论如何,添加了一些解释的答案,所以请检查它。谢谢你解释数学。
    z1' = (z0*h1/h0)+h1