我是openGL的初学者。我目前正在开发一个程序,它接收输入板的宽度和长度。鉴于这些输入,我想动态定位我的相机,以便我可以在整个板上查看。我们说我的窗口大小是1024x768。
是否有任何数学公式来计算opengl函数glookat的不同参数以使其成为可能?
我希望在主板上看到的视图应该是这样的。
如果太大的电路板会让事情变得微不足道并不重要。最重要的是将摄像机定位成使整个电路板上的视图成为可能
到目前为止,我无可救药地随意改变我的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();
输出如下:
答案 0 :(得分:0)
虽然这是作为XNA教程编写的,但它背后的基本技术和数学应该延续到OpenGL和你的项目:
Positioning the Camera to View All Scene Objects
另见
8.070如何自动计算显示整个模型的视图? (我知道边界球和向上矢量。)
编辑以回应评论问题
边界球体只是一个完全包围模型的球体。它可以描述为:
具有 n 点的 P 点集的边界球 S 由 中心点, c ,半径 r 。
所以,
P
=模型的顶点(本例中为电路板)
c
=模型的来源
r
=距离原点最远的P
的顶点距离
所以你的棋盘的边界球将由原点位置(c
)和从一个角到原点(r
)的距离组成,假设棋盘是一个正方形,所有点都是等距。
答案 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
的工作原理。