我有一个不同(但已知)大小的GLScene对象。它完全被TGLDummyCube
包围。
我想定位GLCamera
(使用CameraStyle:glPerspective
),以便屏幕上的对象完全可见。我基本上运行了 - 对象是可见的,但距离有时太远,或者对象比屏幕大并且被剪裁。
我该怎么做?我想这可以通过相机距离和焦距的巧妙组合来完成,但到目前为止我还没有成功。
与OpenGL相比,这在GLScene中似乎有所不同。我正在使用GLScene和Delphi 2007。
答案 0 :(得分:4)
虽然改变相机距离和焦距会改变物体的视觉尺寸,但它的缺点是也会改变视角,从而导致视线有些扭曲。我建议改用相机的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;
DummyCubes ZoomRefX
和ZoomRefY
的大小适合于查看窗口的左右或上下边缘的小边距。两者的位置都使正面相匹配。此外,目标对象的位置与其正面与这些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的大小。