2013-03-03 70 views
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单元的箱体尺寸)

Good view

这正是我想要的。 (黄线显示边框)

但是,当我加载一个STL模型,这是约60 * 60 * 60单位大,我得到这个:

Bad view

这是非常小的,太远了。

我该如何改变才能使其工作?

下面是完整的东西:https://dl.dropbox.com/u/17798054/program.zip

你可以找到在zip这种模式也是如此。引用的代码位于KRGRAAT.SZE.Control.Engine.GLEngine.UpdateView()

回答

0

显然问题是您在lookAt函数中使用的参数。如果你已经计算出边界立方体,所有你需要做的是从

SIZEX /棕褐色(angleOfPerspective)的摄像头放置在距离(EYEZ)

其中SIZEX是四核的宽度立方建,angleOfPerspective是具有前四边形的centerX == POSX == CENTREX和前四的centerY == POSY == centreY和锥台当然GlPerspective的第一参数没有必要

的lookAt参考http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml

+0

太棒了,谢谢:) – 2013-03-04 10:41:43

+0

没问题。 PS。我真的很讨厌tg,但这似乎是使用LookAt函数最简单的方法。 – Arek 2013-03-04 19:31:41

0

所以,澄清y 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);