Three.js根据object3D大小确定摄像机距离

时间:2016-10-18 18:18:52

标签: opengl-es camera three.js

我正在尝试确定相机需要距离我的object3D有多远,而object3D是一个网格集合,以便整个模型在视口中构图。

我得到像这样的object3D大小:

public getObjectSize ( target: THREE.Object3D ): Size {
  let box: THREE.Box3 = new THREE.Box3().setFromObject(target);
  let size: Size = {
    depth: (-1 * box.min.z) + box.max.z,
    height: (-1 * box.min.y) + box.max.y,
    width: (-1 * box.min.x) + box.max.x
  };
  return size;
}

接下来,我尝试使用trig来确定相机需要在多大程度上根据该盒子大小,以便整个盒子可见。

private determinCameraDistance(): number {
    let cameraDistance: number;
    let halfFOVInRadians: number = this.geometryService.getRadians(this.FOV / 2);
    let height: number = this.productModelSizeService.getObjectSize(this.viewService.primaryView.scene).height;
    let width: number = this.productModelSizeService.getObjectSize(this.viewService.primaryView.scene).width;
    cameraDistance = ((width / 2) / Math.tan(halfHorizontalFOVInRadians));
    return cameraDistance;
}

数学全部在纸上进行,三角形相邻边的长度(相机距离)可以使用^ 2 + b ^ 2 = c ^ 2来验证。然而由于某种原因,返回的距离是10.4204,而我需要显示整个object3D的相机距离实际上是95(通过硬编码值确定),这导致只能看到我的模型的一小部分。

关于我可能做错的任何想法,或更好的方法来确定这一点。在我看来,当从盒子尺寸单位到相机距离单位时,我缺少某种单位转换

计算中使用的实际数字:

FOV = 110 degrees,
Object3D size: {
  Depth: 11.6224,
  Height: 18.4,
  Width: 29.7638
}

因此,我们采取视野的一半来创建一个直角三角形,相邻边沿我们的相机距离放置,即55度。然后我们使用公式Degrees * PI / 180将55度转换为弧度当量,即.9599。接下来我们将object3D宽度的一半,再创建一个直角三角形,即14.8819。我们现在可以将我们的半宽度除以FOV的切线(以弧度表示),这给出了相邻边/相机距离为10.4204的长度。

我们可以进一步验证这一侧的正确长度我将再次使用SOHCAHTOA得到斜边的长度:

Sin(55) = 14.8819 / y
.8192 * y = 14.8819
y = 14.8819 / .8192
y = 18.1664

现在使用这个我们可以使用毕达哥拉斯定理求解b来检验我们的数学。

14.8819^2 + b^2 = 18.1664^2
221.4709 + b^2 = 330.0018
b^2 = 108.5835
b = 10.4203 (we're off by .0001 but that's due to rounding)

1 个答案:

答案 0 :(得分:0)

问题最终是在THREE.js视野中代表垂直可视区域。我一直认为像Maya和其他应用程序一样使用Field of View作为水平查看区域。

将我获得的FOV乘以纵横比,可以得到正确的水平视野,从而使相机距离达到~92。