gluLookAt() 在 OpenGL 中没有效果
gluLookAt() has no effect in OpenGL
我试图使用 gluLookAt() 函数从另一侧看正方形。
使用该功能后,没有任何变化,尽管我预计正方形的角会发生变化。
我将相机指向世界的最右侧,然后查看其中心,即正方形所在的位置。
他不得不向两侧伸展。为什么什么都没有改变?
法典:
#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
序列调用而引起的。这是不允许的。你必须在glBegin
之前打电话给gluLookAt
。
一旦基元的绘制开始glBegin
则只允许指定顶点坐标(glVertex
)和更改属性(例如glColor
,glTexCoord
...),直到抽奖结束(glEnd
)。
所有其他指令将被忽略并导致GL_INVALID_OPERATION
错误(错误代码 1282)。
进一步注意,glLookAt
不会设置当前矩阵。它定义一个矩阵并将当前矩阵乘以新矩阵。设置矩阵模式(glMatrixMode
)并在gluLookAt
之前设置单位矩阵glLoadIdentity
。
使用视图矩阵
gluLookAt(-300, 0, 0, 0, 0, 0, 0, 1, 0);
你想要"看到"任何东西,因为使用该矩阵,视线是沿着 x 轴设置的,您可以从侧面查看二维多边形。
请注意,多边形是 2D 对象。如果您从正面、侧面(然后它是一条线且不可见)或从两者之间的方向看,对象的大小会有所不同。gluLookAt
的前 3 个参数定义观点,接下来的 3 个参数定义您查看的点。从视点到你看的点的矢量是视线。
可能你想沿着 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();
}
使用正交(平行)投影。如果使用透视投影,则当到视点的距离增加时,对象的投影大小将减小。透视投影可以通过gluPerspective
设置。例如:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0, (double)windowWidth / windowHeight, 0.1, 600.0);
相关文章:
- unique_ptr:在分配之前调用 reset 有什么效果
- opengl 如何知道有多少个顶点?
- gluLookAt() 在 OpenGL 中没有效果
- OpenGL中的GL_R8和GL_R8UI有什么不同吗?
- VS2017 中的头文件中有多个错误,opengl 项目C++
- 在 OpenGL 中,在保持良好帧速率的同时,VBO 中有多少个顶点的好目标是什么
- SetPixelFormat() 中的第三个参数对于 OpenGL 上下文创建有什么意义?
- 有没有更快的方法来在 OpenGL 中指定立方体贴图纹理
- opengl驱动程序在有限的VRAM中处理大型纹理阵列的效果如何
- 为什么OpenGL告诉我我已经使用了GL_STATIC_DRAW,而我另有规定?
- 我的矩阵堆栈实现(OpenGL ES 2.0)有什么问题
- 有没有办法访问OpenGL的深度缓冲区
- 我正在尝试运行CUDA示例,但是我在Ubuntu 16.04 Lts上的OpenGL(libglew.a)有问题
- 有提升一些东西到 fsync() 的效果
- OpenGL在一个窗口中有多个渲染上下文
- 有没有办法在OpenGL上获取旋转的纹理
- 有关如何在OpenGL中正确旋转/翻译对象的任何建议,以实现以下效果
- 如何在C中获取char阵列的第一个X元素?提升效果是否有改进的方法
- 有没有人有一个OpenGL ES 2.0 Qt 5示例在iOS下工作
- D3D11中是否有与OpenGL glVertexAttrib()等效的工具