我试图使用gluLookAt()函数从另一侧看正方形。
使用该函数后,没有任何变化,尽管我希望正方形的角会变化。
我将相机点设置在世界的最右边,并查看其中心,即正方形所在的位置。
他不得不向两侧拉伸(stretch)。为什么什么都没有改变?
码:
#include "includes.h"
using namespace std;
constexpr auto FPS_RATE = 60;
int windowHeight = 600, windowWidth = 600, windowDepth = 600;
void init();
void idleFunction();
void displayFunction();
double getTime();
double getTime()
{
using Duration = std::chrono::duration<double>;
return std::chrono::duration_cast<Duration>(
std::chrono::high_resolution_clock::now().time_since_epoch()
).count();
}
const double frame_delay = 1.0 / FPS_RATE;
double last_render = 0;
void init()
{
glutDisplayFunc(displayFunction);
glutIdleFunc(idleFunction);
glViewport(0, 0, windowWidth, windowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-windowWidth / 2, windowWidth / 2, -windowHeight / 2, windowHeight / 2, -windowDepth / 2, windowDepth / 2);
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}
void idleFunction()
{
const double current_time = getTime();
if ((current_time - last_render) > frame_delay)
{
last_render = current_time;
glutPostRedisplay();
}
}
void displayFunction()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_POLYGON);
gluLookAt(-300, 0, 0,
0, 0, 0,
0, 1, 0);
glColor3f(1, 1, 1);
glVertex3i(-150, 150, 0);
glVertex3i(150, 150, 0);
glVertex3i(150, -150, 0);
glVertex3i(-150, -150, 0);
glEnd();
glutSwapBuffers();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(windowWidth, windowHeight);
glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) - windowWidth) / 2, (GetSystemMetrics(SM_CYSCREEN) - windowHeight) / 2);
glutCreateWindow("Window");
init();
glutMainLoop();
return 0;
}
最佳答案
造成此问题的原因是, gluLookAt()
是按glBegin
/ glEnd
序列调用的。这是不允许的。您必须先调用gluLookAt
,再调用glBegin
。
glBegin
开始绘制图元后,仅允许指定顶点坐标( glVertex
)并更改属性(例如 glColor
, glTexCoord
...),直到绘制结束(glEnd
)。
所有其他指令将被忽略,并导致GL_INVALID_OPERATION
错误(错误代码1282)。
还要注意,glLookAt
不会设置当前矩阵。它定义一个矩阵,并将当前矩阵乘以新矩阵。设置矩阵模式( glMatrixMode
),并在glLoadIdentity
之前通过Identity matrix设置 gluLookAt
。
与 View 矩阵
您想“看到”任何东西,因为通过该矩阵,视线沿x轴设置,并且您从侧面看了二维多边形。
注意,多边形是2D对象。如果从正面,侧面(然后是一条线且不可见)或介于两者之间的方向看,则对象的大小将显示不同。 gluLookAt
的前三个参数定义观察点,接下来的3个参数定义观察点。从视点到观察点的 vector 是视线。
您可能想沿z轴看一下:
void displayFunction()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, -300, 0, 0, 0, 0, 1, 0);
glBegin(GL_POLYGON);
glColor3f(1, 1, 1);
glVertex3i(-150, 150, 0);
glVertex3i(150, 150, 0);
glVertex3i(150, -150, 0);
glVertex3i(-150, -150, 0);
glEnd();
glutSwapBuffers();
}
您使用Orthographic (parallel) projection。如果使用Perspective projection,则当到视点的距离增加时,对象的投影大小将减小。透视投影可以通过
gluPerspective
设置。例如。:glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0, (double)windowWidth / windowHeight, 0.1, 600.0);