4

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

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

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

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

4

2 回答 2

4

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

唉,我没有有效的步骤来计算正确的值。在我的情况下,我必须缩放到具有不同大小的立方体,而查看器的窗口大小是恒定的。因此,我在目标立方体的位置放置了两个虚拟立方体,每个虚拟立方体的大小都适合观看者的宽度或高度,并具有适当的SceneScale、相机距离和值FocalLength。在运行时,我SceneScale通过目标立方体大小与虚拟立方体大小的比率来计算新值。这在我的情况下非常有效。

编辑:这是我为计算所做的一些代码。

  • ZoomRefXZoomRefY是那些DummyCubes
  • TargetDimXTargetDimY给出当前对象的大小
  • DesignWidth并且DesignHeightMyGLView在设计时的大小
  • DesignSceneScale是相机SceneScale在设计时的

计算代码:

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

DummyCubesZoomRefXZoomRefY的大小使它们与查看窗口的左右或上下边缘有一个小的边距。两者都被定位以便正面匹配。此外,目标对象的定位使其正面与这些 DummyCube 的正面相匹配。

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

于 2009-07-25T16:24:22.580 回答
0

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

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

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

于 2015-06-09T00:19:46.480 回答