摄像机Learn OpenGL

本文详细介绍了3D场景中摄像机的位置、方向、右轴和上轴设置,以及如何使用LookAt函数和自由旋转来实现摄像机的视角变换。通过摄像机位置、目标点和上向量的设定,可以创建观察矩阵,使摄像机能够从不同角度观察场景。同时,通过改变摄像机位置实现自由移动,以提供更丰富的视角体验。

需求

需求:摄像机在世界空间位置、观察方向、右向量和上向量。
在这里插入图片描述

1.摄像机位置

::世界空间中代表摄像机的向量。

glm::vec3 cameraPos=glm::vec3(0.0f,0.0f,3.0f);

!!!Z轴是屏幕指向自己。如果希望摄像机往后移动,把Z往正方向移动。

2.摄像机方向

::摄像机位置方向—场景原点向量=指向原点。

glm::vec3 cameraTarget=glm::vec3(0.0f,0.0f,0.0f);
glm::vec3 caremaDiretion=glm::normalize(cameraPos-cameraTarget);

!!!:方向向量:摄像机到目标向量的反方向(如上图)

3.右轴和上轴

获取右轴(代表摄像机空间X轴的正方向):定义一个上向量(Up Vector),将上向量和摄像机方向向量叉乘。(交换顺序得到X轴负方向的向量)

glm::vec3 up=glm::vec3(0.0f,1.0f,0.0f)
glm::vec3 cameraRight=glm::normalize(glm::cross(up,cameraDirection));

获取上轴(正Y轴):把右轴和方向向量进行叉乘。

glm::vec3 cameraUp=glm::corss(cameraDirection,cameraRight);

4.Look At

作用:如果你定义了一个坐标空间,里面有3个相相互垂直的轴,你可以用这三个轴+一个平移向量来创建一个矩阵,用这个矩阵乘以任何向量来变换到那个坐标空间!
R:右向量,U:上向量,P:摄像机位置向量

glm::mat4 view;
view=glm::lookAt(glm::vec3(0.0f,0.0f,3.0f),
					glm::vec3(0.0f,0.0f,0.0f),
					glm::vec3(0.0f,1.0f,0.0f));
//只需要:摄像机位置,目标位置,表示上向量的世界空间中的向量)

5.摄像机在场景旋转

目的:摄像机在场景旋转,注视点始终在(0,0,0)
每一帧创建x,z坐标。x和z在一个圆圈上的一点。

GLfloat radius=10.0f;
GLfloat camx=sin(glfwGetTime())*radius;
GLfloat camz=cos(glfwGetTime())*radius;
glm::mat4 view;
view = glm::lookAt(glm::vec3(camx,0.0,camz),glm::vec3(0.0,0.0,0.0),glm:vec3(0.0,1.0,0.0));

5.自由移动

### OpenGL 学习入门指南 #### 工具与库介绍 OpenGL Utilities 提供了许多方便的函数,这些工具构建在核心 OpenGL 库之上,使得开发人员能够更高效地利用 OpenGL 的功能[^1]。 #### 基础概念理解 对于初学者来说,了解 OpenGL 的基本工作原理至关重要。这包括但不限于顶点着色器和片元着色器的概念以及它们的作用机制。VAO (Vertex Array Object) 和 VBO (Vertex Buffer Object) 是实现图形渲染的重要组成部分,在学习过程中应重点关注其创建、配置及绑定过程[^2]。 #### 实践操作建议 当深入到高级主题如灯光与阴影时,应该先熟悉不同类型的光源及其属性设定方式。实际动手尝试各种灯光组合下的视觉表现可以帮助加深印象并提高技能水平。此外,还应当关注性能调优方面的知识,比如减少不必要的计算量来提升最终产品的运行效率[^3]。 ```python # 示例代码展示简单的初始化流程(伪代码) import OpenGL.GL as gl def init_vao(): vao = glGenVertexArrays(1) glBindVertexArray(vao) def compile_shader(shader_type, source): shader = glCreateShader(shader_type) glShaderSource(shader, source) glCompileShader(shader) return shader vertex_shader_code = """ #version 330 core layout(location=0) in vec3 position; void main(){ gl_Position = vec4(position.x,position.y,position.z,1.0); } """ fragment_shader_code = """ #version 330 core out vec4 FragColor; void main() { FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); } """ ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值