3D游戏中的数学方法(C++实现)1
来源:互联网 发布:查看udp端口 编辑:程序博客网 时间:2024/06/05 23:01
从今天开始开始3D游戏中的相关的数学实现:
先从基本必须的3D向量类实现开始:
vector3d.h:
#include<cmath>#include<cassert>
namespace OG3D
{
class CVector3D
{
public:
float x,y,z;
public:
CVector3D(float const& _x=0.0f,float const& _y=0.0f,float const& _z=0.0f):
x(_x),y(_y),z(_z) { }
CVector3D(CVector3D const& av): x(av.x),y(av.y),z(av.z) { }
~CVector3D() { }
CVector3D& operator=(CVector3D const& vec)
{
x=vec.x;
y=vec.y;
z=vec.z;
return *this;
}
float& operator[](size_t i)
{
i%=3;
if(i==0) return x;
if(i==1) return y;
return z;
}
float const& operator[](size_t i) const
{
i%=3;
if(i==0) return x;
if(i==1) return y;
return z;
}
bool valid() const
{
return x==0.0f && y==0.0f && z==0.0f;
}
float length_square() const
{
return x*x+y*y+z*z;
}
float length() const
{
return sqrtf(length_square());
}
void normalize()
{
float _t(length());
assert(_t!=0.0f);
_t=1.0f/_t;
x*=_t;
y*=_t;
z*=_t;
}
CVector3D& operator*=(float const& c)
{
x*=c;
y*=c;
z*=c;
return *this;
}
CVector3D& operator/=(float const& c)
{
assert(c!=0.0f);
float const _tc(1.0f/c);
x*=_tc;
y*=_tc;
z*=_tc;
return *this;
}
CVector3D& operator+=(CVector3D const& rv)
{
x+=rv.x;
y+=rv.y;
z+=rv.z;
return *this;
}
CVector3D& operator-=(CVector3D const& rv)
{
x-=rv.x;
y-=rv.y;
z-=rv.z;
return *this;
}
float operator%=(CVector3D const& rv) const
{
return dot(rv);
}
CVector3D& operator*=(CVector3D const& rv)
{
return product(rv);
}
private:
float dot(CVector3D const& vec) const
{
return x*vec.x+y*vec.y+z*vec.z;
}
CVector3D& product(CVector3D const& vec)
{
float _tx(0.0f),_ty(0.0f),_tz(0.0f);
_tx=y*vec.z-z*vec.y;
_ty=z*vec.x-x*vec.z;
_tz=x*vec.y-y*vec.x;
return *this;
}
};
inline CVector3D operator*(CVector3D const& lhs,float const& rhs)
{
CVector3D _res(lhs);
_res*=rhs;
return _res;
}
inline CVector3D operator*(float const& lhs,CVector3D const& rhs)
{
CVector3D _res(rhs);
_res*=lhs;
return _res;
}
inline CVector3D operator/(CVector3D const& lhs,float const& rhs)
{
CVector3D _res(lhs);
_res/=rhs;
return _res;
}
inline float operator%(CVector3D const& lhs,CVector3D const& rhs)
{
return lhs%=rhs;
}
inline CVector3D operator*(CVector3D const& lhs,CVector3D const& rhs)
{
CVector3D _res(lhs);
_res*=rhs;
return _res;
}
inline bool operator==(CVector3D const& lhs,CVector3D const& rhs)
{
return lhs[0]==rhs[0] && lhs[1]==rhs[1] && lhs[2]==rhs[2];
}
inline bool operator!=(CVector3D const& lhs,CVector3D const& rhs)
{
return lhs[0]!=rhs[0] || lhs[1]!=rhs[1] || lhs[2]!=rhs[2];
}
}
这个只是初始版,之后还有矩阵类的相关变换,包括平移和旋转,相关实现在矩阵类
- 3D游戏中的数学方法(C++实现)1
- 3D游戏中的数学方法(C++实现)3
- 3D游戏中的数学方法(C++实现)2
- 3D游戏与计算机图形学中的数学方法-视截体
- 3D游戏中的数学运用
- 3D游戏中的数学运用
- 3D游戏中的数学基础
- 3D数学库的简单实现(C语言)
- 3D游戏引擎数学基础1--3D坐标系
- 游戏开发中的数学和物理算法(5):圆(2D)和球(3D)
- 游戏开发中的数学和物理算法(5):圆(2D)和球(3D)
- 游戏开发中的数学和物理算法(5):圆(2D)和球(3D)
- 3D数学基础 图形与游戏开发的学习 (四)[2D笛卡尔数学]
- 3D数学基础,图形与游戏开发笔记1
- 3D游戏引擎数学基础3--向量(下篇)
- 3D游戏引擎数学基础2--向量(上篇)
- 3D游戏的数学基础
- 3D游戏的数学基础
- 开放式系统互联模型基础知识
- docx4j -- 使用Java处理word2007(.docx)文档
- java 虚拟机安全
- xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则
- 使用JavaScript获取PHP代码中的数组
- 3D游戏中的数学方法(C++实现)1
- 创建点实体图层--向量图层,为什么在图层管理器中没有添加点、线、面的按钮?
- DedeCMS中用到的字符编码转换
- ipcs
- Haydn第104号交响曲的讨论
- GCC 小技巧
- 举杯邀明月,共看断点行
- HTTP状态码总结
- linux 硬连接与软连接与复制