4

さまざまな (しかし既知の) サイズの GLScene オブジェクトがあります。で完全に囲まれていTGLDummyCubeます。

オブジェクトが画面上で完全に見えるようGLCameraに( CameraStyle: を使用して)を配置します。基本的にこれを実行しました-オブジェクトは表示されますが、距離が遠すぎるか、オブジェクトが画面よりも大きくて切り取られます。glPerspective

どうやってやるの?これは、カメラの距離と焦点距離を巧みに組み合わせることで実現できると思いますが、今のところ成功していません。

これは、GLScene では OpenGL とは異なるようです。GLScene と Delphi 2007 を使用しています。

4

2 に答える 2

4

カメラの距離と焦点距離を変更すると、オブジェクトの視覚的なサイズが変更されますが、視点も変更されるため、ビューが多少歪むという欠点があります。SceneScale代わりに、カメラのプロパティを使用することをお勧めします。

残念ながら、その正しい値を計算するための有効な手順はありません。私の場合、ビューアのウィンドウサイズは一定ですが、さまざまなサイズの立方体にスケーリングする必要があります。そこで、ターゲットキューブの位置に2つのダミーキューブを配置しました。それぞれのサイズは、ビューアーの幅または高さに合わせて、、SceneScaleカメラ距離、およびの適切な値を使用しFocalLengthます。SceneScale実行時に、ダミーキューブのサイズに対するターゲットキューブのサイズの比率で新しいものを計算します。私の場合、これは非常にうまく機能します。

編集:これが私が計算のために作ったコードです。

  • ZoomRefXそしてZoomRefYそれらのDummyCubesです
  • TargetDimXTargetDimY現在のオブジェクトのサイズを指定します
  • DesignWidthとは設計時DesignHeightのサイズですMyGLView
  • DesignSceneScaleSceneScale設計時のカメラです

計算コード:

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

DummyCubesはZoomRefXZoomRefY表示ウィンドウの左右または上下の端にわずかなマージンがあるようにサイズ設定されています。どちらも前面が一致するように配置されています。また、ターゲットオブジェクトは、その前面がこれらのDummyCubeの前面と一致するように配置されます。

上記の式では、ウィンドウサイズを設計時とは異なるものにすることができますが、実際にはこの機能をテストしていません。

于 2009-07-25T16:24:22.580 に答える