在-Revit-里重现-Forge-Viewer相机的状态
最近,我收到一个客户的需求,希望可以把Viewer的相机状态通过Revit API还原到Revit里。所以我们来看看要如何实现这个要求。在开始之前,你要先知道一些有关于Revit相机的事情: Revit预设的相机FOV值大约为50度,焦距为38.6mm,片幅尺寸为36mm。Revit默认的渲染图片尺寸为6英吋。为了调整Revit相机的FOV值,我们必须利用修改3D视图的裁剪尺寸来完成。因为Revit API没有直接的方法可以修改相机的FOV值。Viewer的相机视角比Revit的相机视角宽。注意:上述关于Revit的相机参数皆为我反复测试得出,Revit没有确切的值,即皆为近似值。 好的,我们转换过程的总思路如下(注意:接下来的步骤适用透视相机模式): Forge Viewer的部分: 从当前视图的 Viewer 相机获取焦距,目标,位置和上向量。 调用 Viewer3D#getFocalLength 以取得焦距。调用 Viewer3D#getState({ viewport: true }) 以取得当前视图必要的相机状态,例如: { "viewport": { "name": "", "eye": [ -14.870469093323, 36.571562767029, -1.2129259109497 ], "target": [ -14.770469665527, 36.571967124939, -1.2129259109497 ], "up": [ 0, 0, 1 ], "worldUpVector": [ 0, 0, 1 ], "pivotPoint": [ -14.770469665527, 36.571967124939, -1.2129259109497 ], "distanceToOrbit": 0.10000024532334, "aspectRatio": 3.1789297658863, "projection": "perspective", "isOrthographic": false, "fieldOfView": 90.68087674208 }}获取当前加载模型的 global offset(注意:Viewer 默认使用 global offset 来调整加载模型的位置,以避免浮点运算精度和 z-buffer fighting的问题): ...