1

stl モデルを openGL で表示する必要があります。(SharpGL.) モデルが画面の中央にあり、ほぼ画面いっぱいになるように、初期ビューを設定したいと思います。モデルのバウンディング キューブを計算し、ビューを次のように設定しました: (sceneBox は Rect3D です - 左背面下隅の位置とサイズを格納します)

// Calculate viewport properties
double left = sceneBox.X;
double right = sceneBox.X + sceneBox.SizeX;
double bottom = sceneBox.Y;
double top = sceneBox.Y + sceneBox.SizeY;

double zNear = 1.0;
double zFar = zNear + 3 * sceneBox.SizeZ;

double aspect = (double)this.ViewportSize.Width / (double)this.ViewportSize.Height;

if ( aspect < 1.0 ) { 
    bottom /= aspect;
    top /= aspect;
} else {
    left *= aspect;
    right *= aspect;
}

//  Create a perspective transformation.
gl.Frustum(
    left / ZoomFactor, 
    right / ZoomFactor,
    bottom / ZoomFactor, 
    top / ZoomFactor,
    zNear, 
    zFar);

//  Use the 'look at' helper function to position and aim the camera.
gl.LookAt(
    0, 0, 2 * sceneBox.SizeZ,           
    sceneBox.X + 0.5 * sceneBox.SizeX, sceneBox.Y + 0.5 * sceneBox.SizeY, sceneBox.Z - 0.5 * sceneBox.SizeZ,    
    0, 1, 0);                   

これは私の小さな手作りのテスト モデルでうまく機能します: (ボックス サイズは 2*2*2 単位です)

良い眺め

これはまさに私が欲しいものです。(黄色の線は境界ボックスを示しています)

しかし、約 60*60*60 ユニットの stl モデルをロードすると、次のようになります。

悪い眺め

それは非常に小さく、高すぎます。

機能させるには何を変更すればよいですか?

ここに完全なものがあります:https ://dl.dropbox.com/u/17798054/program.zip

このモデルは zip にもあります。引用されたコードはKRGRAAT.SZE.Control.Engine.GLEngine.UpdateView()

4

2 に答える 2

0

だから、アレックの答えを明確にするために、これは私がそれを修正した方法です:

// Calculate viewport properties
double zNear = 1.0;
double zFar = zNear + 10 * sceneBox.SizeZ; // had to increase zFar

double aspect = (double)this.ViewportSize.Width / (double)this.ViewportSize.Height;

double angleOfPerspective = 60.0;
double centerX = sceneBox.X + 0.5 * sceneBox.SizeX;
double centerY = sceneBox.Y + 0.5 * sceneBox.SizeY;
double centerZ = sceneBox.Z + 0.5 * sceneBox.SizeZ;

//  Create a perspective transformation.
gl.Perspective( // swapped frustum for perspective
    angleOfPerspective / ZoomFactor, // moved zooming here
    aspect,
    zNear,
    zFar);

//  Use the 'look at' helper function to position and aim the camera.
gl.LookAt(
    centerX, centerY, sceneBox.SizeX / Math.Tan(angleOfPerspective), // changed eye position
    centerX, centerY, -centerZ,
    0, 1, 0);
于 2013-03-04T10:46:40.117 に答える
0

どうやら問題は、lookAt関数で使用している引数です。バウンディングキューブを計算した場合は、カメラからの距離(eyeZ)に配置するだけです。

sizeX / tan(angleOfPerspective)

ここで、sizeXは、立方体が構築されるクワッドの幅です。angleOfPerspectiveは、もちろん、フロントクワッドのcenterX == posX == centerX、フロントクワッドのcenterY == posY == centerYであり、錐台は必要ありません。

lookAtリファレンスhttp://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml

于 2013-03-03T23:12:36.673 に答える