Object

I3DObject::I3DObject(void)
    : m_vPos(0.0f, 0.0f, 0.0f)
    , m_vLook(0.0f, 0.0f, 1.0f)
    , m_vRight(1.0f, 0.0f, 0.0f)
    , m_vUp(0.0f, 1.0f, 0.0f)
    , m_vSpeed(100.0f, 100.0f, 100.0f)
    , m_vScale(1.0f, 1.0f, 1.0f)
    , m_vRotSpeed(1.0f, 1.0f, 1.0f)
    , m_visible(true)
    , m_lockHInMap(false)
    , m_lockHeight(5.0f)
{
}

I3DObject::~I3DObject()
{
}

void I3DObject::resetdir()
{
    m_vLook.set(0.0f, 0.0f, 1.0f);
    m_vRight.set(1.0f, 0.0f, 0.0f);
    m_vUp.set(0.0f, 1.0f, 0.0f);
}

void I3DObject::normalizeVector(void)
{
    D3DXVec3Normalize(&m_vLook, &m_vLook);
    D3DXVec3Cross(&m_vRight, &m_vUp, &m_vLook);
    D3DXVec3Normalize(&m_vRight, &m_vRight);
    D3DXVec3Cross(&m_vUp, &m_vLook, &m_vRight);
    D3DXVec3Normalize(&m_vUp, &m_vUp);
}

void I3DObject::moveLook(float fElapse)		//前进
{
	m_vPos += m_vLook*(m_vSpeed.z*fElapse);
}

void I3DObject::moveUp(float fElapse)			//上升
{
	m_vPos += m_vUp*(fElapse*m_vSpeed.y);
}

void I3DObject::moveRight(float fElapse)	//平移
{
	m_vPos += m_vRight*(m_vSpeed.x*fElapse);
}

void I3DObject::rotationUp(float angle)		//绕up旋转
{
	Physics::Matrix4x4 t;
	D3DXMatrixRotationAxis(&t, &m_vUp, angle);
	D3DXVec3TransformCoord(&m_vRight, &m_vRight, &t);
	D3DXVec3TransformCoord(&m_vLook, &m_vLook, &t);

    normalizeVector();
}
void I3DObject::rotationLook(float angle)	//绕Look旋转
{
	Physics::Matrix4x4 t;
	D3DXMatrixRotationAxis(&t, &m_vLook, angle);
	D3DXVec3TransformCoord(&m_vRight, &m_vRight, &t);
	D3DXVec3TransformCoord(&m_vUp, &m_vUp, &t);

    normalizeVector();
}
void I3DObject::rotationRight(float angle)	//绕right旋转
{
	Physics::Matrix4x4 t;
	D3DXMatrixRotationAxis(&t, &m_vRight, angle);
	D3DXVec3TransformCoord(&m_vUp, &m_vUp, &t);
	D3DXVec3TransformCoord(&m_vLook, &m_vLook, &t);

    normalizeVector();
}


void I3DObject::rotationAxis(const Physics::Vector3 & a, float angle )
{
	Physics::Matrix4x4 t;
	D3DXMatrixRotationAxis(&t, &a, angle);
	D3DXVec3TransformCoord(&m_vRight, &m_vRight, &t);
	D3DXVec3TransformCoord(&m_vLook, &m_vLook, &t);
	D3DXVec3TransformCoord(&m_vUp, &m_vUp, &t);

    normalizeVector();
}

/*绕X、Y、Z轴旋转*/
void I3DObject::rotationX(float angle)
{
    Physics::Matrix4x4 t;
    D3DXMatrixRotationX(&t,angle);
    D3DXVec3TransformCoord(&m_vLook,&m_vLook,&t);
    D3DXVec3TransformCoord(&m_vRight,&m_vRight,&t);
    D3DXVec3TransformCoord(&m_vUp,&m_vUp,&t);

    normalizeVector();
}

void I3DObject::rotationY(float angle)
{
    Physics::Matrix4x4 t;
    D3DXMatrixRotationY(&t,angle);
    D3DXVec3TransformCoord(&m_vLook,&m_vLook,&t);
    D3DXVec3TransformCoord(&m_vRight,&m_vRight,&t);
    D3DXVec3TransformCoord(&m_vUp,&m_vUp,&t);

    normalizeVector();
}

void I3DObject::rotationZ(float angle)
{
    Physics::Matrix4x4 t;
    D3DXMatrixRotationZ(&t,angle);
    D3DXVec3TransformCoord(&m_vLook,&m_vLook,&t);
    D3DXVec3TransformCoord(&m_vRight,&m_vRight,&t);
    D3DXVec3TransformCoord(&m_vUp,&m_vUp,&t);

    normalizeVector();
}

void I3DObject::getWorldMatrix(Physics::Matrix4x4 & mat) const//获得世界矩阵
{
    mat._11 = m_vRight.x;	mat._21 = m_vUp.x;	 mat._31 = m_vLook.x;	mat._14 = 0.0f;
	mat._12 = m_vRight.y;	mat._22 = m_vUp.y;	 mat._32 = m_vLook.y;	mat._24 = 0.0f;
	mat._13 = m_vRight.z;	mat._23 = m_vUp.z;	 mat._33 = m_vLook.z;	mat._34 = 0.0f;
	mat._41 = m_vPos.x;		mat._42 = m_vPos.y;		 mat._43 = m_vPos.z;			mat._44 = 1.0f;
    
#if 0
    if (m_fScale != 1.0f)
    {
        Physics::Matrix4x4 matScale;
        D3DXMatrixScaling(&matScale,m_fScale,m_fScale,m_fScale);
        mat = matScale * mat;
    }
#else
    for(int i=0; i<3; ++i)
    {
        for(int k=0; k<3; ++k)
        {
            mat.m[i][k] *= m_vScale[i];
        }
    }
#endif
}


void I3DObject::getCameraMatrix(Physics::Matrix4x4 & mat) const
{
    float x = -D3DXVec3Dot(&m_vPos, &m_vRight);
    float y = -D3DXVec3Dot(&m_vPos, &m_vUp);
    float z = -D3DXVec3Dot(&m_vPos, &m_vLook);

    mat._11 = m_vRight.x;	mat._12 = m_vUp.x;	 mat._13 = m_vLook.x;	mat._14 = 0.0f;
    mat._21 = m_vRight.y;	mat._22 = m_vUp.y;	 mat._23 = m_vLook.y;	mat._24 = 0.0f;
    mat._31 = m_vRight.z;	mat._32 = m_vUp.z;	 mat._33 = m_vLook.z;	mat._34 = 0.0f;
    mat._41 = x;			mat._42 = y;		 mat._43 = z;			mat._44 = 1.0f;
}

Physics::Matrix4x4 I3DObject::getRotationMatrix()
{
    Physics::Matrix4x4 mat;
    normalizeVector();

	float x=m_vPos.x;
	float y=m_vPos.y;
	float z=m_vPos.z;

    mat._11 = m_vRight.x;	mat._21 = m_vUp.x;	 mat._31 = m_vLook.x;	mat._14 = 0.0f;
	mat._12 = m_vRight.y;	mat._22 = m_vUp.y;	 mat._32 = m_vLook.y;	mat._24 = 0.0f;
	mat._13 = m_vRight.z;	mat._23 = m_vUp.z;	 mat._33 = m_vLook.z;	mat._34 = 0.0f;
	mat._41 = x;			mat._42 = y;		 mat._43 = z;			mat._44 = 1.0f;
    
    Physics::Matrix4x4 matScale;
    D3DXMatrixScaling(&matScale,m_vScale.x,m_vScale.y,m_vScale.z);
    mat = matScale * mat;

    return mat;
}

Physics::Matrix4x4 I3DObject::getRotationMatrix2()
{
    Physics::Matrix4x4 mat;
    normalizeVector();

    float x = -D3DXVec3Dot(&m_vPos, &m_vRight);
    float y = -D3DXVec3Dot(&m_vPos, &m_vUp);
    float z = -D3DXVec3Dot(&m_vPos, &m_vLook);

    mat._11 = m_vRight.x;	mat._12 = m_vUp.x;	 mat._13 = m_vLook.x;	mat._14 = 0.0f;
    mat._21 = m_vRight.y;	mat._22 = m_vUp.y;	 mat._23 = m_vLook.y;	mat._24 = 0.0f;
    mat._31 = m_vRight.z;	mat._32 = m_vUp.z;	 mat._33 = m_vLook.z;	mat._34 = 0.0f;
    mat._41 = x;			mat._42 = y;		 mat._43 = z;			mat._44 = 1.0f;
    return mat;
}


void I3DObject::getWorldAABB(Physics::AABB & aabb) const
{
    Physics::Matrix4x4 mat;
    getWorldMatrix(mat);
    m_aabb.applyMatrix(aabb, mat);
}

//////////////////////////////////////////////////////////////////////////

I3DObjectFPS::I3DObjectFPS(void)
{
    m_fRotAngLook = 0.0f;//绕look方向的旋转角度
    m_fRotAngRight = 0.0f;
    m_fRotAngUp = 0.0f;
    m_fRotAngX = 0.0f;
    m_fRotAngY = 0.0f;
    m_fRotAngZ = 0.0f;
}

void I3DObjectFPS::addAngleLook(float angle)
{
    m_fRotAngLook += angle;
}

void I3DObjectFPS::addAngleRight(float angle)
{
    m_fRotAngRight += angle;

    float bound = D3DX_PI/3; //旋转界限
    if (m_fRotAngRight > bound)
    {
        m_fRotAngRight = bound;
    }
    else if (m_fRotAngRight < -bound)
    {
        m_fRotAngRight = -bound;
    }
}

void I3DObjectFPS::addAngleUp(float angle)
{
    m_fRotAngUp += angle;
}

void I3DObjectFPS::addAngleX(float angle)
{
    m_fRotAngX += angle;
}

void I3DObjectFPS::addAngleY(float angle)
{
    m_fRotAngY += angle;
}

void I3DObjectFPS::addAngleZ(float angle)
{
    m_fRotAngZ += angle;
}


void I3DObjectFPS::updateMatrix(void)
{
    m_vLook = Physics::Vector3(0.0f, 0.0f, 1.0f);
    m_vRight = Physics::Vector3(1.0f, 0.0f, 0.0f);
    m_vUp = Physics::Vector3(0.0f, 1.0f, 0.0f);
    rotationLook(m_fRotAngLook);
    rotationRight(m_fRotAngRight);
    rotationUp(m_fRotAngUp);
    rotationX(m_fRotAngX);
    rotationY(m_fRotAngY);
    rotationZ(m_fRotAngZ);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值