|
|

楼主 |
发表于 2008-8-27 18:30:00
|
显示全部楼层
Re:inst名称空间(我的)源代码下载(.H)
现在,也可以使用这个URL访问:
http://cpp.instemast.com/
新加了一个 instMatrix.h 头文件(需要VC++2005以上),
可满足任何matrix,向量运算的需求,且内存结构和d3d9一致。
例:
Float4 vec = { 1, 2, 3 };
Float4x4 mat = { <略> };
Float4 result = mat * vec;
其中, Float4 是 MATRIX<Float,4,1> 的 typedef
也支持不确定大小的矩阵
使用这个 instMatrix.h 编写3D专用的数学函数也很简单:
// inst3DXMath.h 的主要部分
__forceinline Float4 ToHomo(const Float3 &vec)
{
Float4 ret = { vec.x, vec.y, vec.z, 1 };
return ret;
}
__forceinline Float3 FromHomo(const Float4 vec)
{
Float3 ret = { vec.x/vec.w, vec.y/vec.w, vec.z/vec.w };
return ret;
}
// 没有 Normallize, 应当用 vec /= Norm(vec) 或 ret = vec / Norm(vec).
__forceinline Float3 Cross(const Float3 &vec1,const Float3 &vec2)
{
Float3 ret = { vec1.y * vec2.z - vec1.z * vec2.y,
vec1.z * vec2.x - vec1.x * vec2.z,
vec1.x * vec2.y - vec1.y * vec2.x, };
return ret;
}
__forceinline Float3 Transform(const Float4x4 &mat,const Float3 &vec)
{
return FromHomo( mat * ToHomo(vec) );
}
__forceinline Float4x4 Translation(Float x,Float y,Float z)
{
Float4x4 ret = { 1, 0, 0, x,
0, 1, 0, y,
0, 0, 1, z,
0, 0, 0, 1, };
return ret;
}
__forceinline Float4x4 Scaling(Float sx,Float sy,Float sz)
{
Float4x4 ret = { sx, 0, 0, 0,
0, sy, 0, 0,
0, 0, sz, 0,
0, 0, 0, 1, };
return ret;
}
__forceinline Float4x4 RotationX(Float angle)
{
Float4x4 ret = {0}; // fill all with 0
ret(1,1) = ret(4,4) = 1;
ret(2,2) = ret(3,3) = cos(angle);
ret(2,3) = -sin(angle);
ret(3,2) = sin(angle);
return ret;
}
__forceinline Float4x4 RotationY(Float angle)
{
Float4x4 ret = {0}; // fill all with 0
ret(1,1) = ret(3,3) = cos(angle);
ret(2,2) = ret(4,4) = 1;
ret(1,3) = sin(angle);
ret(3,1) = -sin(angle);
return ret;
}
__forceinline Float4x4 RotationZ(Float angle)
{
Float4x4 ret = {0}; // fill all with 0
ret(1,1) = ret(2,2) = cos(angle);
ret(1,2) = -sin(angle);
ret(2,1) = sin(angle);
ret(3,3) = ret(4,4) = 1;
return ret;
}
__forceinline Float4x4 RotationAxis(const Float3 &axis,Float angle)
{
Float4x4 tmp; // NO init
D3DXMatrixRotationAxis((D3DXMATRIX *)&tmp,(D3DXVECTOR3 *)&axis,angle);
return Transpose(tmp);
}
__forceinline Float4x4 ToParent(const Float3 &pos,const Float3 &look,const Float3 &up)
{
Float3 Zaxis = look / Norm(look);
Float3 Xaxis = Cross(up,Zaxis);
Xaxis /= Norm(Xaxis);
Float3 Yaxis = Cross(Zaxis,Xaxis);
Float4x4 ret =
{
Xaxis.x, Yaxis.x, Zaxis.x, pos.x,
Xaxis.y, Yaxis.y, Zaxis.y, pos.y,
Xaxis.z, Yaxis.z, Zaxis.z, pos.z,
0, 0, 0, 1,
};
return ret;
}
__forceinline Float4x4 FromParent(const Float3 &pos,const Float3 &look,const Float3 &up)
{
Float3 Zaxis = look / Norm(look);
Float3 Xaxis = Cross(up,Zaxis);
Xaxis /= Norm(Xaxis);
Float3 Yaxis = Cross(Zaxis,Xaxis);
Float4x4 ret =
{
Xaxis.x, Xaxis.y, Xaxis.z, -Dot(pos,Xaxis),
Yaxis.x, Yaxis.y, Yaxis.z, -Dot(pos,Yaxis),
Zaxis.x, Zaxis.y, Zaxis.z, -Dot(pos,Zaxis),
0, 0, 0, 1,
};
return ret;
}
__forceinline Float4x4 Look(const Float3 &eye,const Float3 &look,const Float3 &up)
{
return FromParent(eye,look,up);
}
__forceinline Float4x4 LookAt(const Float3 &eye,const Float3 &look_at,const Float3 &up)
{
return Look(eye, look_at - eye, up);
}
__forceinline Float4x4 PerspectiveFov(Float fovY,Float aspect,Float zn,Float zf)
{
Float4x4 ret = {0}; // fill all with 0
ret(2,2) = Ctg(fovY/2);
ret(1,1) = ret(2,2)/aspect;
ret(3,3) = zf/(zf-zn);
ret(3,4) = -(zn*zf)/(zf-zn);
ret(4,3) = 1;
return ret;
} |
|