//-----------------------------------------------------
//@title HBone.h
//@writer Xu Linlin
//@createdate 2017-12-26
//@function 声明Bone类
//-----------------------------------------------------
#ifndef HBONE_H
#define HBONE_H
#include "stdio.h"
#include "HMatrix.h"
using namespace std;
class HBone
{
public:
HBone(); //默认构造函数1
HBone(const HBone &bo); //构造函数2
HBone & operator = (const HBone &bo); //构造函数3
void setNumber(const int &i); //设置节点号
int getNumber(); //获得节点号
void setOffset(HVector off); //设置offset
void getOffset(HVector &off); //获得offset
void setRotation(HVector rot); //设置原始Rotaion
void getRotation(HVector &rot); //获得原始Rotaion
void setBrother(const int & bro); //设置兄弟节点
void setFirstChild(const int & firch); //设置第一个子节点
int getBrother(); //获得兄弟节点
int getFirstChild(); //获得第一个子节点
~HBone(){}
private:
int m_Number;
float m_Offset[3];
float m_Rotation[3];
int m_Brother;
int m_FirstChild;
};
#endif
//-----------------------------------------------------
//@title HBone.cpp
//@writer Xu Linlin
//@createdate 2017-12-26
//@function 定义Bone类
//-----------------------------------------------------
#include "HBone.h"
HBone::HBone():m_Number(-1),m_Brother(-1), m_FirstChild(-1) //默认构造函数
{
m_Offset[0] = m_Offset[1] = m_Offset[2] = 0.0;
m_Rotation[0] = m_Rotation[1] = m_Rotation[2] = 0.0;
}
//构造函数
HBone::HBone(const HBone &bo)
{
//name = bo.name;
m_Number = bo.m_Number;
for(int i=0; i<3; i++)
{
m_Offset[i] = bo.m_Offset[i];
m_Rotation[i] = bo.m_Rotation[i];
}
m_Brother = bo.m_Brother;
m_FirstChild = bo.m_FirstChild;
}
//重载等于运算符
HBone & HBone::operator= (const HBone &bo)
{
if(this != &bo)
{
m_Number =bo.m_Number;
for(int i=0; i<3; i++)
{
m_Offset[i] = bo.m_Offset[i];
m_Rotation[i] = bo.m_Rotation[i];
}
m_Brother = bo.m_Brother;
m_FirstChild = bo.m_FirstChild;
}
return *this;
}
//设置节点号
void HBone::setNumber(const int &i)
{
m_Number = i;
}
//获得节点号
int HBone::getNumber()
{
return m_Number;
}
//设置兄弟节点
void HBone::setBrother(const int & bro)
{
m_Brother = bro;
}
//设置第一个子节点
void HBone::setFirstChild(const int & firch)
{
m_FirstChild = firch;
}
//获得兄弟节点
int HBone::getBrother()
{
return m_Brother;
}
//获得第一个子节点
int HBone::getFirstChild()
{
return m_FirstChild;
}
//设置offset
void HBone::setOffset(HVector off)
{
m_Offset[0] = off.getMemberValue(0);
m_Offset[1] = off.getMemberValue(1);
m_Offset[2] = off.getMemberValue(2);
}
//获得offset
void HBone::getOffset(HVector &off)
{
off.setMemberValue(0, m_Offset[0]);
off.setMemberValue(1, m_Offset[1]);
off.setMemberValue(2, m_Offset[2]);
}
//设置原始Rotaion
void HBone::setRotation(HVector rot)
{
m_Rotation[0] = rot.getMemberValue(0);
m_Rotation[1] = rot.getMemberValue(1);
m_Rotation[2] = rot.getMemberValue(2);
}
//获得原始Rotaion
void HBone::getRotation(HVector &rot)
{
rot.setMemberValue(0, m_Rotation[0]);
rot.setMemberValue(1, m_Rotation[1]);
rot.setMemberValue(2, m_Rotation[2]);
}
//-----------------------------------------------------
//@title HMmatrix.h
//@writer Xu Linlin
//@createdate 2017-12-28
//@function 声明一些矩阵计算函数
//-----------------------------------------------------
#ifndef __HMATRIX_H__
#define __HMATRIX_H__
#include "math.h"
#include <assert.h>
#include <string>
#define N 4
#define EPS 1.0E-9
#define PI 3.14159
using namespace std;
class HMatrix;
class HVector//向量类,可以表示角度
{
public:
HVector(); //默认构造函数1
HVector(const HVector &vector); //构造函数2
HVector(const float &vec_x, const float &vec_y, const float &vec_z); //构造函数3
//设置三个值
void setValue(const float &vec_x, const float &vec_y, const float &vec_z);
//等于一个向量
HVector &operator= (const HVector &vector);
//加等一个向量
HVector &operator+= (const HVector &vector);
//减等一个向量
HVector &operator-= (const HVector &vector);
//乘等一个向量
HVector &operator*= (const HVector &vector);
//乘等一个数
HVector &operator*= (const float &coe);
//加一个向量
HVector operator+ (const HVector &vector);
//减一个向量
HVector operator- (const HVector &vector);
//乘一个向量
HVector operator* (const HVector &vector);
//乘一个数
HVector operator* (const float &coe);
//获得向量的转换角度
void getVectorRotation(HVector &angle);
//点坐标乘矩阵后得到新的点坐标,保存在ver中
void multiplyMatrix(HMatrix m);
//使向量旋转
void rotateVector(HVector rot);
//返回向量中某元素
float getMember(const int &i);
//设置某元素值
void setMember(const int &i, const float &value);
private:
float m_Vector[3];
};
class HMatrix
{
public:
HMatrix(); //默认构造函数1
HMatrix(const HMatrix &matrix); //构造函数2
//初始化矩阵为单位矩阵
void initIdentity();
//等于一个矩阵
HMatrix &operator= (const HMatrix &pMatrix);
//加等一个矩阵
HMatrix &operator+= (const HMatrix &pMatrix);
//减等一个矩阵
HMatrix &operator-= (const HMatrix &pMatrix);
//乘等一个矩阵
HMatrix &operator*= (const HMatrix &pMatrix);
//乘等一个数
HMatrix &operator*= (const float &coe);
//加一个矩阵
HMatrix operator+ (const HMatrix &pMatrix);
//减一个矩阵
HMatrix operator- (const HMatrix &pMatrix);
//乘一个矩阵
HMatrix operator* (const HMatrix &pMatrix);
//乘一个数
HMatrix operator* (const float &coe);
//获得offset组成的矩阵
void getOffsetMatrix(HVector pOffset);
//获得rotation组成的矩阵,flag是标志位(0,1,2分别表示x,y,z),angle是转换角度
void getRotationMatrix(int flag, float angle);
//获得经过offset转化后的矩阵
void multiplyOffset(HVector pOffset);
//获得经过rotation转化后的矩阵,flag是标志位(0,1,2分别表示x,y,z),angle是转换角度
void multiplyRotation(int flag, float angle);
void multiplyRotation(HVector pAngle, int m_RotateOrder);
//求矩阵的逆矩阵,保存在pInverse中
void inverseMatrix(HMatrix &pInverse);
//返回矩阵中某元素
float getMember(const int &i, const int &j);
~HMatrix(){}
private:
float m_Matrix[N][N];
void swapRow(HMatrix &pMatrix, int i, int j);
void scaleRow(HMatrix &pMatrix, int i, float coef);
void addRowToAnother(HMatrix &pMatrix, int i, int j, float coef);
};
#endif
//-----------------------------------------------------
//@title HMatrix.cpp
//@writer Xu Linlin
//@createdate 2017-12-28
//@function 声明一些矩阵计算函数
//-----------------------------------------------------
#include "hmatrix.h"
HMatrix::HMatrix() //默认构造函数1
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m_Matrix[i][j] = 0.0;
}
HMatrix::HMatrix(const HMatrix &matrix) //构造函数2
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m_Matrix[i][j] = matrix.m_Matrix[i][j];
}
//初始化矩阵为单位矩阵
void HMatrix::initIdentity()
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
{
if(i == j)
m_Matrix[i][j] = 1.0;
else
m_Matrix[i][j] = 0.0;
}
}
//等于一个矩阵
HMatrix &HMatrix::operator= (const HMatrix &pMatrix)
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m_Matrix[i][j] = pMatrix.m_Matrix[i][j];
return *this;
}
//加一个矩阵
HMatrix &HMatrix::operator+= (const HMatrix &pMatrix)
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m_Matrix[i][j] += pMatrix.m_Matrix[i][j];
return *this;
}
//减一个矩阵
HMatrix &HMatrix::operator-= (const HMatrix &pMatrix)
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m_Matrix[i][j] -= pMatrix.m_Matrix[i][j];
return *this;
}
//乘等一个矩阵
HMatrix &HMatrix::operator*= (const HMatrix &pMatrix)
{
HMatrix pM;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
{
pM.m_Matrix[i][j] = 0.0;
for(int k=0; k<N; k++)
pM.m_Matrix[i][j] += m_Matrix[i][k] * pMatrix.m_Matrix[k][j];
}
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m_Matrix[i][j] = pM.m_Matrix[i][j];
return *this;
}
//乘一个数
HMatrix &HMatrix::operator*= (const float &coe)
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m_Matrix[i][j] *= coe;
return *this;
}
//加一个矩阵
HMatrix HMatrix::operator+ (const HMatrix &pMatrix)
{
HMatrix m;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m.m_Matrix[i][j] = m_Matrix[i][j] + pMatrix.m_Matrix[i][j];
return m;
}
//减一个矩阵
HMatrix HMatrix::operator- (const HMatrix &pMatrix)
{
HMatrix m;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m.m_Matrix[i][j] = m_Matrix[i][j] - pMatrix.m_Matrix[i][j];
return m;
}
//乘一个矩阵
HMatrix HMatrix::operator* (const HMatrix &pMatrix)
{
HMatrix m;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
{
m.m_Matrix[i][j] = 0.0;
for(int k=0; k<N; k++)
m.m_Matrix[i][j] += m_Matrix[i][k] * pMatrix.m_Matrix[k][j];
}
return m;
}
//乘一个数
HMatrix HMatrix::operator* (const float &coe)
{
HMatrix m;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
m.m_Matrix[i][j] = m_Matrix[i][j] * coe;
return m;
}
//获得offset组成的矩阵(pMatrix必须为4阶方阵)
void HMatrix::getOffsetMatrix(HVector p