我有一个变化(但已知)大小的GLScene对象。它完全被TGLDummyCube包围。

我想放置GLCamera(使用CameraStyle:glPerspective),以便该对象在屏幕上完全可见。我基本上可以运行该对象-该对象可见,但是距离有时太远,或者该对象大于屏幕并被裁剪。

我怎样才能做到这一点?我想这可以通过巧妙地组合相机距离和焦距来完成,但是到目前为止我还没有成功。

与OpenGL相比,GLScene似乎有所不同。我正在使用GLScene和Delphi 2007。

最佳答案

尽管改变相机距离和焦距会改变对象的视觉尺寸,但它也具有改变视角的缺点,因此会导致图像失真。我建议改用相机的SceneScale属性。

las,我没有有效的步骤来为此计算正确的值。就我而言,我必须缩放到具有可变大小的多维数据集,而查看器的窗口大小是恒定的。因此,我在目标多维数据集的位置放置了两个虚拟多维数据集,每个虚拟多维数据集的大小都适合于观看者的宽度或高度,并具有SceneScale,相机距离和FocalLength的适当值。在运行时,我通过目标多维数据集大小与虚拟多维数据集大小之比来计算新的SceneScale。就我而言,这很好。

编辑:这是我为计算而编写的一些代码。


ZoomRefXZoomRefY是那些DummyCube
TargetDimXTargetDimY给出当前对象的大小
DesignWidthDesignHeight是设计时MyGLView的大小
DesignSceneScale是相机在设计时的SceneScale


计算代码:

ScaleX := (ZoomRefX.CubeSize*MyGLView.Width)/(DesignWidth*TargetDimX);
ScaleY := (ZoomRefY.CubeSize*MyGLView.Height)/(DesignHeight*TargetDimY);
NewSceneScale := Min(ScaleX, ScaleY)*DesignSceneScale;


DummyCubes ZoomRefXZoomRefY的大小设置为使它们在查看窗口的左右边缘或上下边缘具有较小的边距。两者的位置均使正面匹配。同样,将目标对象定位为使其正面与这些DummyCubes的正面匹配。

上面的公式允许窗口大小与设计时间不同,但是我实际上并未测试此功能。

08-27 18:12