Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何调整GLCAMER以显示整个GLCAMER场景_Delphi_Opengl_Glscene - Fatal编程技术网

Delphi 如何调整GLCAMER以显示整个GLCAMER场景

Delphi 如何调整GLCAMER以显示整个GLCAMER场景,delphi,opengl,glscene,Delphi,Opengl,Glscene,我有一个大小不同(但已知)的GLScene对象。它被一个TGLDummyCube完全包围 我想定位GLCamera(使用CameraStyle:glPerspective)以便对象在屏幕上完全可见。我基本上做到了这一点——对象是可见的,但有时距离太远,或者对象比屏幕大并被剪裁 我该怎么做?我想这可以通过巧妙地结合相机距离和焦距来实现,但到目前为止我还没有成功 与OpenGL相比,GLScene中的情况似乎有所不同。我使用的是GLScene和Delphi 2007。虽然改变相机距离和焦距会改变对象

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

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

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


与OpenGL相比,GLScene中的情况似乎有所不同。我使用的是GLScene和Delphi 2007。

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

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

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

  • ZoomRefX
    ZoomRefY
    都是DummyCube
  • 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的正面相匹配


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

@Andrease好像您一直在玩SceneScale(如您在评论中所述)这意味着您正在寻找一种合适的方法,通过更改摄影机距离/焦距或调整对象大小,使对象适合摄影机视图。如果是这样,调整单个对象大小以适应屏幕的最简单方法是使用其BoundingSphereRadius属性,如下所示:

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

你可以将GLUMIDMyBube作为所有其他场景对象的根对象,然后用上面提到的方法调整GLUMIDMyCube。

如果你没有这样的喜悦,你可能会考虑删除Delphi标签并只询问GLScene,说明任何逻辑都会被欣赏,包括伪代码,并且你将计划适应Delphi。您所使用的语言并不重要,而是您所追求的逻辑/数学。谢谢Argalatyr,但我不确定GLCamera对象-这只是标准OpenGL相机的封装,还是它添加了其他功能?它的核心是经典OpenGL相机,还有其他功能,但是它们并没有改变基本的数学运算。谢谢你的提示——我也一直在玩SceneScale,在我的OnMouseWheel事件处理程序中使用它。我是否正确理解您在开发过程中设置了这些dummycubes,并在运行时相应地调整了多维数据集?听起来是个聪明的把戏。更改对象,而不是相机。在开发过程中,我将dummycubes设置为与查看器窗口大小匹配的大小。两个立方体,因为屏幕不是二次的,但dummycubes是。现在,当我的真实对象的大小是dummycube的两倍时,我知道我必须将场景比例对半,以使其在设计时像dummycube一样可见。分别对宽度和高度进行这些计算,我可以计算使目标对象适合窗口的场景比例。这仅适用于窗口大小固定的情况。我不改变物体——我只改变相机的场景比例。