如何调整GLCamera以显示整个GLScene

时间:2009-07-25 13:08:24

标签: delphi opengl glscene

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

我想定位GLCamera(使用CameraStyle:glPerspective),以便屏幕上的对象完全可见。我基本上运行了 - 对象是可见的,但距离有时太远,或者对象比屏幕大并且被剪裁。

我该怎么做?我想这可以通过相机距离和焦距的巧妙组合来完成,但到目前为止我还没有成功。

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

2 个答案:

答案 0 :(得分:4)

虽然改变相机距离和焦距会改变物体的视觉尺寸,但它的缺点是也会改变视角,从而导致视线有些扭曲。我建议改用相机的SceneScale属性。

唉,我没有有效的步骤来计算正确的值。在我的情况下,我必须缩放到一个不同大小的立方体,而观众的窗口大小是不变的。所以我在目标立方体的位置放置了两个虚拟立方体,每个立方体的大小适合观察者的宽度或高度,并具有SceneScale,相机距离和FocalLength的适当值。在运行期间,我通过目标立方体大小相对于虚拟立方体大小的比率来计算新SceneScale。在我的情况下,这很有效。

编辑:以下是我为计算编写的一些代码。

  • ZoomRefXZoomRefY是DummyCubes
  • 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的正面相匹配。

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

答案 1 :(得分:0)

@Andreas如果你一直在玩SceneScale(正如你在评论中提到的那样)意味着你正在寻找一种适当的方法来通过改变相机距离/焦距或通过调整对象大小来适应相机视图中的对象。如果是这样,调整单个对象以适应屏幕的最简单方法是使用其 BoundingSphereRadius 属性,如下所示:

ResizeMultiplier := 2; //play with it, it depends on your camera params
GLFreeForm1.Scale.Scale(ResizeMultiplier / GLFreeForm1.BoundingSphereRadius);

您可以将GLDummyCube添加为所有其他场景对象的根对象,然后使用上述方法调整GLDummyCube的大小。