C++实现Opengl透视投影
时间: 2024-01-10 21:19:29 浏览: 324
以下是C++实现OpenGL透视投影的代码示例:
```cpp
// 定义投影参数
float fovy = 70.0f; // y轴视角
float aspect = 1.0f; // 投影面的长宽比
float zNear = 0.1f; // 近截面
float zFar = 100.0f; // 远截面
// 计算投影矩阵
glm::mat4 projection = glm::perspective(glm::radians(fovy), aspect, zNear, zFar);
// 将投影矩阵传递给着色器
unsigned int projectionLoc = glGetUniformLocation(shaderProgram, "projection");
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
```
上述代码中,我们首先定义了投影参数,包括y轴视角、投影面的长宽比、近截面和远截面。然后,我们使用GLM库中的`glm::perspective`函数计算投影矩阵。最后,我们将投影矩阵传递给着色器,以便进行渲染。
需要注意的是,我们使用了GLM库中的`glm::value_ptr`函数将投影矩阵转换为指针类型,以便在OpenGL中使用。
相关问题
openGL实现平行投影和透视投影完整代码
以下是使用OpenGL实现平行投影和透视投影的完整代码示例:
平行投影:
```C++
#include <GL/glut.h>
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f(-0.5, -0.5, 0.0);
glVertex3f(-0.5, 0.5, 0.0);
glVertex3f(0.5, 0.5, 0.0);
glVertex3f(0.5, -0.5, 0.0);
glEnd();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Parallel Projection");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
```
透视投影:
```C++
#include <GL/glut.h>
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 1.0, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glutWireTeapot(1.0);
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Perspective Projection");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
```
opengl实现一个长方体的透视投影
以下是使用OpenGL实现长方体的透视投影的示例代码:
```c++
#include <GL/glut.h>
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 1.0, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glPushMatrix();
glTranslatef(-1.0, 0.0, 0.0);
glutSolidCube(1.0);
glPopMatrix();
glColor3f(0.0, 1.0, 0.0);
glPushMatrix();
glTranslatef(1.0, 0.0, 0.0);
glutSolidCube(1.0);
glPopMatrix();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Perspective Projection");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
```
在上述示例代码中,我们使用了OpenGL的透视投影函数 `gluPerspective()` 来设置透视投影。我们还使用了 `gluLookAt()` 函数来设置视点和观察点的位置和方向。在 `display()` 函数中,我们使用 `glPushMatrix()` 和 `glPopMatrix()` 函数来保存和恢复变换矩阵,以便于绘制两个立方体。在每个立方体的绘制中,我们使用了不同的颜色来区分它们。最后,我们使用 `glFlush()` 函数将绘制的结果显示在屏幕上。
阅读全文