摄像机

Posted keguniang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了摄像机相关的知识,希望对你有一定的参考价值。

1、摄像机位置

glm::vec3 camerPos = glm::vec3(0.0,0.0,3.0);

正z轴是从屏幕指向自己的,如果我们希望摄像机向后移动,就是沿着z轴的正方向移动。

2、摄像机方向

即摄像机指向哪个方向。若让摄像机指向场景原点,用场景原点向量减去摄像机位置向量的结果就是摄像机的指向向量。摄像机指向z轴负方向,但我们希望方向向量指向摄像机的z轴正方向。所以我们交换相减的顺序,就会得到一个指向摄像机正z轴方向的向量。

1 glm::vec3 cameraTarget = glm::vec3(0.0,0.0,0.0);
2 glm::vec3 cameraDirection = glm::mormolize(camera-cameraTarget);

3、右轴

右向量代表x轴的正方向。此时,我们先定义一个上向量。然后两个向量叉乘就会得到右向量。(若交换叉乘的顺序会得到x轴负方向的向量

4、上轴

现在我们已经有了x、z轴,然后获取y轴,将x、z轴叉乘即可。

1 glm::vec3 cameraUp = glm::cross(cameraDirection,cameraRight);

步骤:

技术分享图片

5、LookAt矩阵 

 有了3个互相垂直的轴和一个定义摄像机空间的位置坐标,我们就可以创建自己的lookAt矩阵了

 技术分享图片

其中R是右向量,U是上向量,D是方向向量,P是摄像机位置向量。注意位置向量是相反的。

lookAt矩阵作为观察矩阵可以很高效的把所有世界坐标变换到自己的观察空间。

1 glm::mat4 view;
2 view = glm::lookAt(glm::vec3(0.0,0.0,3.0f)
3                              glm:vec3(0.0,0.0,0.0)
4                              glm::vec3(0.0,1.0,0.0))  ;

六、让摄像机绕着场景旋转

绕着y轴旋转,所以y坐标不变,在每一帧创建x,z坐标,它代表圆上的一点,使用它们作为摄像机的位置。不断更新x、z坐标,我们会遍历圆上所有的点。

实际上是摄像机在不断旋转,而物体是不动的,但看起来像是物体在动。

1 float radius = 10.0f;
2 float camX = sin(glfwGetTime())*radius;
3 float camz = cos(glfwGetTime())*radius;
4 glm::mat4 view;
5 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));

 为什么x是cos,z值sin?还有摄像机旋转的曲面是什么样的?

技术分享图片

glfwGetTime(): GLFW 提供一个计时器可以返回开始初始化到当前的时间间隔。

 七、自由移动

以上是关于摄像机的主要内容,如果未能解决你的问题,请参考以下文章

依次播放多个音频片段

TSINGSEE青犀视频通道FFmpeg获取视频片段的方法介绍

从片段中的相机意图返回后屏幕变为白色

将实时镜头从摄像机流式传输到 Unity3D

将实时镜头从摄像机流式传输到 Unity3D

关于ts是啥文件?