第一章《3D理论初步》

发表于2015-10-22
评论0 1.6k浏览

小伙伴们,你们好!

 

      经历了两年多的Cocos2d-x的学习与开发,我相信你们都已经成长为一名合格的Cocos2d-x程序员。但是,千万不要觉得这样就可以万事无忧了!3D时代已经来临,3D手游的产品越来越多,怎么办?使用Unity3D?嗯,是啊,Unity3D看起来不错的样子,不过,你是愿意放弃长期习惯的VC++的开发方式?你是否愿意放弃开源引擎自由掌控代码的感觉?你是否愿意从此站在引擎底层之外,只是做一个使用者?


      如果你想快速的基于现有的Cocos2d-x经验或项目来增加3D部分功能,或者你的志向是和我一样,成为一个引擎开发者,那么,勇敢的踏出这一步吧。相信自已经过短期的学习也有能力做出完整的3D引擎。

 

       注:限于时间仓促,水平有限,错误及不妥之处在所难免,望各位兄台海涵并及时指正。


第一章《3D理论初步》

配套视频:http://my.tv.sohu.com/us/231143039/74549915.shtml

 

一.2D3D:

相信大家都学过平面几何与立体几何,这2D3D就是这两种几何空间,我们之前一直在平面几何里去展示自已的游戏内容,进入到立体几何空间后,XY增加了一个纵深Z,但难度却不仅仅只是增加了1/23D以摸拟现实为最高目标。除了位置的表现方式不同,其在大小,质感,光与影,环境氛围上均有更多深入的表现。

   哈哈,不要怪我,实在找不到太合适的图进行对比:

   这是一个2D场景中的美女:



    这个则是3D场景中的美女:





    同样都是美女,但3D场景中的建筑,人物,环境都有了具体的提升,它非常逼真,几乎和现实没有什么太大的不同。

一切,都源于它多了一个Z轴,使形状,位置,色深,质感有了更细腻的变化。

 

    千里之行,始于足下,在做出非常棒的3D游戏之前,我们先要学习好3D的空间理论,掌握3D空间的位置,旋转,偏移的处理,只有这样,才可能一步步真正的了解3D的精髓。

 

    首先来回顾一下,在2D空间中,我们使用笛卡尔坐标系:


    但在3D空间中,它变成了: 



    左手坐标系与右手坐标系。

 

    坐标系也好,右手系也罢,总归是用手心朝向,大拇指方向,手伸出的方向代表三个轴,XYZ。所有的空间计算也都基于这三个轴。下面我们来详细学习一下。



二.向量:



         空间的点,即一个位置的表示单位,学名向量,程序中就是一个结构,容纳了x,y,z三个变量。在Cocos2d-x中,这个结构体的名称叫做Vec3,它在libcocos2d math目录下的Vec3.h中定义。




[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

  1. class Vec3  

  2. {  

  3. public:  

  4. //X,Y,Z  

  5. float x;  

  6. float y;  

  7. float z;  

  8. //构造与拷贝构造  

  9.     Vec3();  

  10.     Vec3(float xx, float yy, float zz);  

  11.     Vec3(const float* array);  

  12.     Vec3(const Vec3& p1, const Vec3& p2);  

  13. Vec3(const Vec3& copy);  

  14. //从一个DWORD的色彩值中获取向量,即将R,G,B对应到X,Y,Z上返回。  

  15. static Vec3 fromColor(unsigned int color);  

  16. //析构  

  17. ~Vec3();  

  18. //是否是零  

  19. bool isZero() const;  

  20. //是否是一  

  21. bool isOne() const;  

  22. //取得两个向量之间的角度  

  23. static float angle(const Vec3& v1, const Vec3& v2);  

  24. //与参数指定向量相加  

  25. void add(const Vec3& v);  

  26. //取得两个向量相加的和  

  27. static void add(const Vec3& v1, const Vec3& v2, Vec3* dst);  

  28. //将当前向量设置最大和最小值。  

  29. void clamp(const Vec3& min, const Vec3& max);  

  30. //对一个向量设置最大和最小值。  

  31. static void clamp(const Vec3& v, const Vec3& min, const Vec3& max, Vec3* dst);  

  32. //与参数指定向量进行叉积计算。  

  33. void cross(const Vec3& v);  

  34. //取得两个向量的叉积。  

  35. static void cross(const Vec3& v1, const Vec3& v2, Vec3* dst);  

  36. //与参数指定向量进行距离计算。  

  37. float distance(const Vec3& v) const;  

  38.     //与参数指定向量进行距离的平方计算。因为向量长度的计算公式是sqrt(x^2+y^2+z^2);但sqrt比较消耗CPU,所以呢,一般我们在进行长度的使用时,如果是对比操作而不是取值操作,那可以直接用这个函数,相对会快一些,毕竟,两个长度的平方对比和两个长度的对比没有什么区别。  

  39. float distanceSquared(const Vec3& v) const;  

  40. //与参数指定向量进行点积计算  

  41. float dot(const Vec3& v) const;  

  42. //取得两个向量的点积  

  43. static float dot(const Vec3& v1, const Vec3& v2);  

  44. //取得当前向量的长度  

  45. float length() const;  

  46. //取得当前向量的长度的平方。  

  47. float lengthSquared() const;  

  48. //对当前向量取反  

  49. void negate();  

  50. //向量归一化。  

  51. void normalize();  

  52. //取得当前向量的归一化向量值。  

  53. Vec3 getNormalized() const;  

  54. //对当前向量进行缩放。  

  55. void scale(float scalar);  

  56. //设置当前向量的值。  

  57.     void set(float xx, float yy, float zz);  

  58.     void set(const float* array);  

  59.     void set(const Vec3& v);  

  60. void set(const Vec3& p1, const Vec3& p2);  

  61. //与参数指定向量进行相减。  

  62. void subtract(const Vec3& v);  

  63. //取得两个向量的差  

  64. static void subtract(const Vec3& v1, const Vec3& v2, Vec3* dst);  

  65. //通过参数指定向量与时间值来取得插值向量值。  

  66. void smooth(const Vec3& target, float elapsedTime, float responseTime);  

  67. //操作符重载  

  68.     inline const Vec3 operator+(const Vec3& v) const;  

  69.     inline Vec3& operator+=(const Vec3& v);  

  70.     inline const Vec3 operator-(const Vec3& v) const;  

  71.     inline Vec3& operator-=(const Vec3& v);  

  72.     inline const Vec3 operator-() const;  

  73.     inline const Vec3 operator*(float s) const;  

  74.     inline Vec3& operator*=(float s);  

  75.     inline const Vec3 operator/(float s) const;  

  76.     inline bool operator<(const Vec3& v) const;  

  77.     inline bool operator==(const Vec3& v) const;  

  78.     inline bool operator!=(const Vec3& v) const;  

  79.       

  80.     //x,y,z都为0的静态常量向量  

  81.     static const Vec3 ZERO;  

  82.    //x,y,z都为1的静态常量向量  

  83.     static const

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引