1

我必须用 openGL 显示 stl 模型。(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

显然问题是您在 lookAt 函数中使用的参数。如果您已经计算了边界立方体,您需要做的就是将其放置在距相机的距离(eyeZ)处

sizeX/tan(角度透视)

其中 sizeX 是构建立方体的 Quad 的宽度,angleOfPerspective 是 GlPerspective 的第一个参数当然有 centerX == posX == centerX 的前四边形和 centerY == posY == centerY 的前四边形和截头体是不必要的

查看参考http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml

于 2013-03-03T23:12:36.673 回答
0

所以,为了澄清 Arek 的回答,我是这样解决的:

// 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 回答