在3d视图中动态渲染2d板

时间:2014-04-01 21:39:34

标签: c++ opengl

我是openGL的初学者。我目前正在开发一个程序,它接收输入板的宽度和长度。鉴于这些输入,我想动态定位我的相机,以便我可以在整个板上查看。我们说我的窗口大小是1024x768。

是否有任何数学公式来计算opengl函数glookat的不同参数以使其成为可能?

我希望在主板上看到的视图应该是这样的。

board image

如果太大的电路板会让事情变得微不足道并不重要。最重要的是将摄像机定位成使整个电路板上的视图成为可能

到目前为止,我无可救药地随意改变我的glookat函数的参数,直到我遇到了适合X尺寸宽度和Y尺寸高度的东西。

我的gluperpective功能: gluPerspective(70 ,1024 / 768,1,1000)

我40 * 40板的全能功能

gluLookAt(20, 20, 60, 20, -4, -20, 0, 1, 0);

我如何绘制我的棋盘(飞机):

         glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  glMatrixMode( GL_MODELVIEW );

  glLoadIdentity();
  gluLookAt(20, 20, 60, 20, -4, -20, 0, 1, 0);

  glBindTexture(GL_TEXTURE_2D, texture_sol);
  glBegin(GL_QUADS);
  glTexCoord2i(0, 0);  glVertex3i(width, 0, height);
  glTexCoord2i(10, 0);  glVertex3i(0, 0, height)
  glTexCoord2i(10, 10);  glVertex3i(0, 0, 0);
  glTexCoord2i(0, 10);  glVertex3i(width, 0, 0);
  glEnd();

输出如下:

my board output image http://i59.tinypic.com/51y2ic.png

2 个答案:

答案 0 :(得分:0)

虽然这是作为XNA教程编写的,但它背后的基本技术和数学应该延续到OpenGL和你的项目:

Positioning the Camera to View All Scene Objects

另见

OpenGL FAQ

  

8.070如何自动计算显示整个模型的视图? (我知道边界球和向上矢量。)

编辑以回应评论问题

边界球体只是一个完全包围模型的球体。它可以描述为:

  

具有 n 点的 P 点集的边界球 S 由   中心点, c ,半径 r

所以,

P =模型的顶点(本例中为电路板)

c =模型的来源

r =距离原点最远的P的顶点距离

所以你的棋盘的边界球将由原点位置(c)和从一个角到原点(r)的距离组成,假设棋盘是一个正方形,所有点都是等距。

对于更复杂的模型,您可以使用预先创建的解决方案[1]或实施自己的计算[2] [3]

答案 1 :(得分:0)

gluLookAt需要2分和一个向量; eye center 位置以及 up 向量。最后一个参数没有问题。前两个与您的问题相关。

我看到世界空间中的棋盘在正X轴和Y轴上延伸,具有一些任意的宽度和高度值。让我们以width = height = 1.0为例。因此,电路板跨越(0,0),(1,0),(1,1),(0,1);由于电路板位于Y = 0平面上并且所有顶点具有相同的值,因此此处忽略Y值;这些只是(X,Z)值。

现在来gluLookAt eye 是相机在世界空间中的位置, center 是您希望相机查看的位置(在世界空间)

假设您希望相机看到我认为的电路板中心,那么

eye = (width / 2.0f, 0, height/2.0f);

现在您已将相机定位在其有利位置。说出在电路板上方的某个位置,但是朝向正Z方向,因为用户所在的位置(假设您的世界空间是右手,正Z方向朝向观察者),所以

centre = (width / 2.0f, 5.0f, 1.0f);

由于Z上的最远点是0,我只是添加了一个比父亲稍微多一点。 Y是你想要看到多少板,我只选择了5.0作为例子。这些只是我能提出的任意值,您仍然需要尝试这些值。但我希望你了解gluLookAt的工作原理。