Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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
C# 对中场景的问题_C#_Wpf_Opengl - Fatal编程技术网

C# 对中场景的问题

C# 对中场景的问题,c#,wpf,opengl,C#,Wpf,Opengl,我必须用openGL显示stl模型。(SharpGL.)我想设置初始视图,使模型位于屏幕的中心,并大致填充它。我已经计算了模型的边界立方体,并如下设置视图:(sceneBox是一个Rect3D-它存储左后下角的位置和大小) //计算视口属性 左双=场景框.X; 右双=sceneBox.X+sceneBox.SizeX; 双底=场景框.Y; 双层顶部=sceneBox.Y+sceneBox.SizeY; 双zNear=1.0; 双zFar=zNear+3*sceneBox.SizeZ; 双纵横比=

我必须用openGL显示stl模型。(SharpGL.)我想设置初始视图,使模型位于屏幕的中心,并大致填充它。我已经计算了模型的边界立方体,并如下设置视图:(sceneBox是一个Rect3D-它存储左后下角的位置和大小)

//计算视口属性
左双=场景框.X;
右双=sceneBox.X+sceneBox.SizeX;
双底=场景框.Y;
双层顶部=sceneBox.Y+sceneBox.SizeY;
双zNear=1.0;
双zFar=zNear+3*sceneBox.SizeZ;
双纵横比=(双)this.ViewportSize.Width/(双)this.ViewportSize.Height;
如果(纵横比<1.0){
底部/=侧面;
顶端/=侧面;
}否则{
左*=纵横比;
右*=方面;
}
//创建透视变换。
平截头体(
左/缩放因子,
右/缩放因子,
底部/缩放因子,
顶部/缩放因子,
zNear,
zFar);
//使用“注视”辅助功能定位和对准相机。
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个单位)

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

但是,当我加载一个stl模型时,它大约有60*60*60个单元大,我得到了以下结果:

它很小,而且太高了

我应该做什么改变才能让它工作

下面是全部内容:


您也可以在zip中找到此型号。引用的代码位于
KRGRAAT.SZE.Control.Engine.GLEngine.UpdateView()

显然,问题在于lookAt函数中使用的参数。如果已计算边界立方体,则只需将其放置在距离摄影机的距离(eyeZ)处

sizeX/tan(透视角度)

其中,sizeX是构建立方体的四元体的宽度,angleOfPerspective是GlPerspective的第一个参数,当然,前面四元体的centerX==posX==centreX,centerY==posY==centreY,前面四元体和平截头体不需要


看看参考资料,为了澄清阿雷克的答案,我是这样修正的:

// 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);

没问题。我真的很讨厌除以tg,但这似乎是使用LookAt函数最简单的方法。
// 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);