zoukankan      html  css  js  c++  java
  • 摄像机

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

     七、自由移动

    当我们按下WASD键的任意一个,摄像机的位置都会相应更新。如果我们希望向前或向后移动,我们就把位置向量加上或减去方向向量。如果我们希望向左右移动,我们使用叉乘来创建一个右向量(Right Vector),并沿着它相应移动就可以了。这样就创建了使用摄像机时熟悉的横移(Strafe)效果。

    注:

    我们对右向量进行了标准化。如果我们没对这个向量进行标准化,最后的叉乘结果会根据cameraFront变量返回大小不同的向量。如果我们不对向量进行标准化,我们就得根据摄像机的朝向不同加速或减速移动了,但如果进行了标准化移动就是匀速的。

    八、移动速度

    目前我们的移动速度是个常量。理论上没什么问题,但是实际情况下根据处理器的能力不同,有些人可能会比其他人每秒绘制更多帧,也就是以更高的频率调用processInput函数。结果就是,根据配置的不同,有些人可能移动很快,而有些人会移动很慢。当你发布你的程序的时候,你必须确保它在所有硬件上移动速度都一样。

    图形程序和游戏通常会跟踪一个时间差(Deltatime)变量,它储存了渲染上一帧所用的时间。我们把所有速度都去乘以deltaTime值。结果就是,如果我们的deltaTime很大,就意味着上一帧的渲染花费了更多时间,所以这一帧的速度需要变得更高来平衡渲染所花去的时间。使用这种方法时,无论你的电脑快还是慢,摄像机的速度都会相应平衡,这样每个用户的体验就都一样了。

    我们跟踪两个全局变量来计算出deltaTime值:

    1 float deltaTime = 0.0f;//当前帧与上一帧的时间差
    2 float lastFrame = 0.0f;//上一帧的时间

    在每一帧中我们计算出新的deltaTime以备后用

    1 float currentTime = glfwGetTime();
    2 deltaTime = currentTime-lastFrame;
    3 lastTime = currentTime;

    将cameraSpeed = 2.5f*deltaTime;

    现在得到了一个在任何系统上移动速度都一样的摄像机。

  • 相关阅读:
    各種語系的unicode對應以及local編碼方式
    测试邮箱采集
    devexpress控件例子
    2015结束,2016开始
    MYSQL 导出表结构
    mysql 远程访问
    jQuery的选择器中的通配符[id^='code']
    jquery判断checkbox是否选中及改变checkbox状态
    MYSQL 删除重复记录,只保留最大ID
    java.lang.IllegalArgumentException: Comparison method violates its general contract!
  • 原文地址:https://www.cnblogs.com/keguniang/p/9933857.html
Copyright © 2011-2022 走看看