我有一个不同(但已知)大小的GLScene对象。它被一个TGLDummyCube完全包围了。
我希望定位GLCamera (使用CameraStyle:glPerspective),以便该对象在屏幕上是完全可见的。我基本上是这样运行的--物体是可见的,但有时距离太远,或者物体比屏幕大,而且被剪裁了。
我怎么能这么做?我想这可以通过相机距离和焦距的巧妙组合来完成,但到目前为止我还没有成功。
在GLScene中,这似乎与OpenGL不同。我正在使用GLScene和Delphi2007。
发布于 2009-07-25 16:24:22
虽然改变相机的距离和焦距会改变物体的视觉尺寸,但它也有改变视角的缺点,从而导致了一定程度的扭曲。我建议使用相机的SceneScale属性来代替。
唉,我没有有效的步骤来计算正确的值。在我的例子中,我必须缩放到一个不同大小的立方体,而查看器的窗口大小是恒定的。因此,我在目标立方体的位置放置了两个虚拟立方体,每个尺寸都适合观看者的宽度或高度,并为SceneScale、相机距离和FocalLength设置了适当的值。在运行时,我根据目标立方体大小与虚拟立方体大小的比率来计算新的SceneScale。这在我的情况下效果很好。
编辑:这是我为计算编写的一些代码。
ZoomRefX和ZoomRefY是那些DummyCubesTargetDimX和TargetDimY给出的当前objectDesignWidth和DesignHeight的尺寸,是MyGLView在设计时的尺寸,timeDesignSceneScale是相机的SceneScale,在设计的时候计算程序:
ScaleX := (ZoomRefX.CubeSize*MyGLView.Width)/(DesignWidth*TargetDimX);
ScaleY := (ZoomRefY.CubeSize*MyGLView.Height)/(DesignHeight*TargetDimY);
NewSceneScale := Min(ScaleX, ScaleY)*DesignSceneScale;DummyCubes、ZoomRefX和ZoomRefY的大小使得它们在视图窗口的左、右或上底部边缘有一个小的边距。这两个都是定位的,使前面的脸匹配。另外,目标对象的位置与这些DummyCubes的正面相匹配。
上面的公式允许窗口大小与设计时间不同,但实际上我没有测试这个特性。
发布于 2015-06-09 00:19:46
@Andreas如果您一直在玩SceneScale (正如您在评论中提到的那样),这意味着您正在通过改变相机距离/焦距或调整对象大小来寻找适合相机视图中的对象的适当方法。如果是这样,调整单个对象大小以适应屏幕的最简单方法是使用它的BoundingSphereRadius属性,如下所示:
ResizeMultiplier := 2; //play with it, it depends on your camera params
GLFreeForm1.Scale.Scale(ResizeMultiplier / GLFreeForm1.BoundingSphereRadius);您可以为所有其他场景对象添加GLDummyCube作为根对象,然后使用上面提到的方法调整GLDummyCube的大小。
https://stackoverflow.com/questions/1182070
复制相似问题