码迷,mamicode.com
首页 > 其他好文 > 详细

摄像机

时间:2018-11-10 00:59:23      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:为什么   获取   但我   就是   位置   view   wget   tar   时间间隔   

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 提供一个计时器可以返回开始初始化到当前的时间间隔。

 七、自由移动

摄像机

标签:为什么   获取   但我   就是   位置   view   wget   tar   时间间隔   

原文地址:https://www.cnblogs.com/keguniang/p/9933857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!