虽然改变相机距离和焦距会改变物体的视觉大小,但它的缺点是也会改变视角,从而导致视图有些扭曲。我建议改用相机的SceneScale
属性。
唉,我没有有效的步骤来计算正确的值。在我的情况下,我必须缩放到具有不同大小的立方体,而查看器的窗口大小是恒定的。因此,我在目标立方体的位置放置了两个虚拟立方体,每个虚拟立方体的大小都适合观看者的宽度或高度,并具有适当的SceneScale
、相机距离和值FocalLength
。在运行时,我SceneScale
通过目标立方体大小与虚拟立方体大小的比率来计算新值。这在我的情况下非常有效。
编辑:这是我为计算所做的一些代码。
ZoomRefX
ZoomRefY
是那些DummyCubes
TargetDimX
并TargetDimY
给出当前对象的大小
DesignWidth
并且DesignHeight
是MyGLView
在设计时的大小
DesignSceneScale
是相机SceneScale
在设计时的
计算代码:
ScaleX := (ZoomRefX.CubeSize*MyGLView.Width)/(DesignWidth*TargetDimX);
ScaleY := (ZoomRefY.CubeSize*MyGLView.Height)/(DesignHeight*TargetDimY);
NewSceneScale := Min(ScaleX, ScaleY)*DesignSceneScale;
DummyCubesZoomRefX
和ZoomRefY
的大小使它们与查看窗口的左右或上下边缘有一个小的边距。两者都被定位以便正面匹配。此外,目标对象的定位使其正面与这些 DummyCube 的正面相匹配。
上面的公式允许窗口大小与设计时不同,但我实际上并没有测试这个功能。