信心满满的带了作品去顽石面试,结果在第二个环节被问到了3D数学,果断坑了,领教了一遍Unity3D只是工具,3D数学、图形算法才王道的思想。人家说的在理,也感觉自己太浮躁了,从现在开始一点一点的学回来!下面是一个最基础了Vector3类,其中基本包含了向量常用的方法,也是“3D数学基础 图形与游戏开发”这本书6.2章节的一个例子,感觉很不错,手打了一遍,多加了点注释。另外这个例子里有2个bug,(在159、176这两行)我个人暂时解决不了,有心人可以copy到vs里看一看
1 #include<math.h> 2 3 /* 4 * 3D向量类 5 */ 6 class Vector3 7 { 8 public: 9 //定义 x,y,z轴 10 float x, y, z; 11 12 //默认构造函数,不执行任何操作 13 Vector3() {} 14 15 //复制构造函数 16 Vector3(const Vector3 &a) : x(a.x), y(a.y), z(a.z) {} 17 18 //初始化构造函数 19 Vector3(float nx, float ny, float nz) : x(nx), y(ny), z(nz) {} 20 21 //标准对象操作 22 Vector3 &operator = (const Vector3 &a) 23 { 24 x = a.x; 25 y = a.y; 26 z = a.z; 27 return *this; 28 } 29 30 //置为零向量 31 void zero() 32 { 33 x = y = z = 0.0f; 34 } 35 36 //重载“==”操作符 37 bool operator ==(const Vector3 &a) const 38 { 39 return x == a.x && y == a.y && z == a.z; 40 } 41 42 //重载“!=”操作符 43 bool operator !=(const Vector3 &a) const 44 { 45 return x != a.x || y != a.y || z != a.z; 46 } 47 48 //重载一元“-”运算符 49 Vector3 operator -() const 50 { 51 return Vector3(-x, -y, -z); 52 } 53 54 //重载二元“+”运算符 55 Vector3 operator +(const Vector3 &a) const 56 { 57 return Vector3(x + a.x, y + a.y, z + a.z); 58 } 59 60 //重载二元“-”运算符 61 Vector3 operator -(const Vector3 &a) const 62 { 63 return Vector3(x - a.z, y - a.y, z - a.z); 64 } 65 66 //与标量的乘法 67 Vector3 operator *(float a) const 68 { 69 return Vector3(x * a, y * a, z * a); 70 } 71 72 //与标量的除法(不对除0进行检查) 73 Vector3 operator /(float a) const 74 { 75 //获得倒数 76 float reciprocalA = 1.0f / a; 77 return Vector3(x * reciprocalA, y * reciprocalA, z * reciprocalA); 78 } 79 80 //重载简加运算符 81 Vector3 &operator +=(const Vector3 &a) 82 { 83 x += a.x; 84 y += a.y; 85 z += a.z; 86 return *this; 87 } 88 89 //重载简减运算符 90 Vector3 &operator -=(const Vector3 &a) 91 { 92 x -= a.x; 93 y -= a.y; 94 z -= a.z; 95 return *this; 96 } 97 98 //重载简乘运算符 99 Vector3 &operator *=(const Vector3 &a) 100 { 101 x *= a.x; 102 y *= a.y; 103 z *= a.z; 104 return *this; 105 } 106 107 //重载简乘运算符 108 Vector3 &operator /=(const Vector3 &a) 109 { 110 x /= a.x; 111 y /= a.y; 112 z /= a.z; 113 return *this; 114 } 115 116 //向量标准化(在没有改变本质关系的前提下,把向量的长度标准化为1) 117 void normalize() 118 { 119 float magSq = x * x + y * y + z * z; 120 //除零检查 121 if(magSq > 0.0f) 122 { 123 //向量长度的倒数 124 float magOver = 1.0f / sqrt(magSq); 125 x *= magOver; 126 y *= magOver; 127 z *= magOver; 128 } 129 } 130 131 //向量点乘,重载标准的乘法运算符 132 float operator *(const Vector3 &a) const 133 { 134 return x * a.x + y * a.y + z * a.z; 135 } 136 137 /* 138 * 非成员函数 139 */ 140 141 //向量求模 142 inline float vectorMag(const Vector3 &a) 143 { 144 return sqrt(a.x * a.x + a.y * a.y + a.z * a.z); 145 } 146 147 //向量叉乘 148 inline Vector3 crossProduct(const Vector3 &a, const Vector3 &b) 149 { 150 return Vector3 151 ( 152 a.x * b.y - a.y * b.x, 153 a.y * b.z - a.z * b.y, 154 a.z * b.x - a.x * b.z 155 ); 156 } 157 158 //标量左乘 159 inline Vector3 operator *(float k, const Vector3 &v) 160 { 161 return Vector3(k * v.x, k * v.y, k * v.z); 162 } 163 164 //计算2点之间的距离 165 inline float distance(const Vector3 &a, const Vector3 &b) 166 { 167 //得到向量 168 float dx = a.x - b.x; 169 float dy = a.y - b.y; 170 float dz = a.z - b.z; 171 //返回向量的大小 172 return sqrt(dx * dx + dy * dy + dz * dz); 173 } 174 175 //全局零向量 176 extern const Vector3 kZeroVector; 177 };