cocos2D-X源码分析之从cocos2D-X学习OpenGL(11)----摄像机

原创 2016年06月11日 11:30:19

       本篇文章介绍一个在游戏中的重要概念,在MVP矩阵中,视图矩阵和投影矩阵都和摄像机有关,说句白话,摄像机其实就是生成投影矩阵和视图矩阵的方式和原因,cocos2d-x中使用GamePlay3D类的Mat4类生成各种矩阵,一下就通过分析摄像机Camera类的代码来看这些矩阵是如何生成的。

       首先来看正交矩阵的初始化代码:

bool Camera::initOrthographic(float zoomX, float zoomY, float nearPlane, float farPlane)
{
    _zoom[0] = zoomX;
    _zoom[1] = zoomY;
    _nearPlane = nearPlane;
    _farPlane = farPlane;
    Mat4::createOrthographicOffCenter(0, _zoom[0], 0, _zoom[1], _nearPlane, _farPlane, &_projection);
    _viewProjectionDirty = true;
    _frustumDirty = true;
    
    return true;
}
      正交投影就是没有近大远小概念的投影,它的视锥体就是矩形,所以定义它的时候只要定义视口宽高和近平面以及远平面就可以了。调用Mat4的

createOrthographicOffCenter生成投影矩阵把它传给_projection。

bool Camera::initPerspective(float fieldOfView, float aspectRatio, float nearPlane, float farPlane)
{
    _fieldOfView = fieldOfView;
    _aspectRatio = aspectRatio;
    _nearPlane = nearPlane;
    _farPlane = farPlane;
    Mat4::createPerspective(_fieldOfView, _aspectRatio, _nearPlane, _farPlane, &_projection);
    _viewProjectionDirty = true;
    _frustumDirty = true;
    
    return true;
}
       而透视投影的初始化方式类似,参数分别为:视角角度,宽高比,近平面,远平面,最后函数会把投影矩阵传递给_projection。
       定义一个摄像机,需要摄像机位置,观察方向,还有一个指向它右侧的向量,以及一个它上方的向量,这实际上是一个以摄像机位置为原点的坐标系,如图所示:

       所以说在创建摄像机以后,就要定义它的位置和lookAt

_camera->setPosition3D(Vec3(0, 130, 130) + _sprite3D->getPosition3D());
_camera->lookAt(_sprite3D->getPosition3D());

        lookAt定义了观察目标位置和摄像机向上位置,如果不传参数第二个参数就默认为y轴方向

       在lookAt中,我们定义了lookAt矩阵,也就是视图矩阵,至于视图矩阵的推导,可以参考这篇文章:http://www.cnblogs.com/mincomp/archive/2012/09/06/2672888.html,这里我们只需要知道这个结果就可以:

        R为右向量,U为上向量,D为方向向量,它们的计算过程就在lookAt函数中:

    //向上向量
    Vec3 upv = up;
    upv.normalize();
    //摄像机方向
    Vec3 zaxis;
    Vec3::subtract(this->getPosition3D(), lookAtPos, &zaxis);
    zaxis.normalize();
    //右轴
    Vec3 xaxis;
    Vec3::cross(upv, zaxis, &xaxis);
    xaxis.normalize();
    //上轴
    Vec3 yaxis;
    Vec3::cross(zaxis, xaxis, &yaxis);
    yaxis.normalize();
    //lookAt矩阵
    Mat4  rotation;
    rotation.m[0] = xaxis.x;
    rotation.m[1] = xaxis.y;
    rotation.m[2] = xaxis.z;
    rotation.m[3] = 0;
    
    rotation.m[4] = yaxis.x;
    rotation.m[5] = yaxis.y;
    rotation.m[6] = yaxis.z;
    rotation.m[7] = 0;
    rotation.m[8] = zaxis.x;
    rotation.m[9] = zaxis.y;
    rotation.m[10] = zaxis.z;
    rotation.m[11] = 0;
       注意,这里的摄像机方向实际上是摄像机位置向量指向它看着的方向的相反方向,然后下面用向量的叉乘获得右轴和上轴,从而获得lookAt矩阵所需要的值,这些计算的原理可以参考:https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process

       下一篇将介绍天空盒的原理


       能力不足,水平有限,如有问题,欢迎指出。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Cocos 3D功能初探学习笔记(1)---摄像机

本篇首先介绍摄像机,其实2D时cocos引擎就有摄像机这个概念,每个节点都拥有一个摄像机类,当时的摄像机类的使用实例就是实现节点对象的缩放旋转,因为节点本身就自带这些功能,所以摄像机使用的场合并不多,...
  • bill_man
  • bill_man
  • 2015年09月03日 23:17
  • 5953

cocos2D-X源码分析之从cocos2D-X学习OpenGL(4)---混合

之前在项目中就使用过混合,但是研究的不深入,近期美术的一个需求让我下决心重新深入的研究了一下混合以及它在cocos2d-x中的使用,在这里分享给大家。...
  • bill_man
  • bill_man
  • 2015年12月30日 20:12
  • 3927

Cocos2d-x中3D相机的使用

转载自:http://cn.cocos2d-x.org/tutorial/show?id=2019 本教程是讲Cocos2d-x中相机的使用,在Cocos2d-x 3.2版本中加入了相机这个类,这个...
  • yuxikuo_1
  • yuxikuo_1
  • 2014年12月12日 13:38
  • 1479

cocos2D-X源码分析之从cocos2D-X学习OpenGL(1)----cocos2D-X渲染结构

cocos2D-X 3.0渲染结构代码讲解,也是cocos2D-X源码讲解系列文章和从cocos2D-X学习OpenGL系列文章的开始...
  • bill_man
  • bill_man
  • 2014年06月29日 22:17
  • 12800

基于Cocos2d-x学习OpenGL ES 2.0系列——编写自己的shader(2)

在上篇文章中,我给大家介绍了如何在Cocos2d-x里面绘制一个三角形,当时我们使用的是Cocos2d-x引擎自带的shader和一些辅助函数。在本文中,我将演示一下如何编写自己的shader,同时,...
  • czh3642210
  • czh3642210
  • 2017年07月17日 09:21
  • 284

opengl 教程(13) 摄像机坐标系

http://www.cnblogs.com/mikewolf2002/archive/2013/01/15/2861796.html 原帖地址:http://ogldev.atsp...
  • anypkv
  • anypkv
  • 2013年10月23日 20:15
  • 808

Cocos2d-x实现简易翻牌效果

翻牌效果网上找了好多,复杂点的有自己重写一个sprite类来实现,简单的就利用引擎自带的动作CCOrbitCamera来实现,但是存在一些问题,图片旋转之后变反了。 我在用的只是一个简单的翻牌效果,点...
  • Nat_myron
  • Nat_myron
  • 2014年08月08日 10:43
  • 1260

Cocos 3D功能初探学习笔记(1)---摄像机

本篇首先介绍摄像机,其实2D时cocos引擎就有摄像机这个概念,每个节点都拥有一个摄像机类,当时的摄像机类的使用实例就是实现节点对象的缩放旋转,因为节点本身就自带这些功能,所以摄像机使用的场合并不多,...
  • bill_man
  • bill_man
  • 2015年09月03日 23:17
  • 5953

Cocos2d-x3.2与OpenGL渲染总结(一)Cocos2d-x3.2的渲染流程

这是一篇比较详细介绍Cocos2d-x3.2渲染过程的文章。
  • cbbbc
  • cbbbc
  • 2014年09月21日 22:36
  • 12144

cocos2d-x学习资源整理(持续更新)

书籍资料: 《cocos2d-x权威指南》 cocos2d x 2.01版本 《Cocos2d-x高级开发教程:制作自己的《捕鱼达人》》 《Cocos2D-X游戏开发技术精解》  阅读其中一本即可,剩...
  • u013174689
  • u013174689
  • 2014年02月15日 22:30
  • 5267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2D-X源码分析之从cocos2D-X学习OpenGL(11)----摄像机
举报原因:
原因补充:

(最多只允许输入30个字)