|
|
发表于 2007-9-5 12:23:00
|
显示全部楼层
Re:旋转物体的问题!!
你这段代码是摄像机对巴,我有一个封装的很好的摄像机,送给你:
http://bbs.gameres.com/showthread.asp?postid=467279
//Camera.h
void Vec3MulMat(D3DXVECTOR3*,D3DXVECTOR3*,D3DXMATRIXA16*);//向量乘以矩阵
void CreateViewMat(D3DXMATRIX*,D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*);//建立视矩阵
void MoveOnAxis(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,float);//沿着某个轴移动
void RotateWithAxis(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*,float);//围绕某个轴旋转
class CCamera
{
public:
CCamera(float,float,float);
CCamera(D3DXVECTOR3*,D3DXVECTOR3*,D3DXVECTOR3*);
void MoveByWorld(float,float,float);//按照世界坐标移动
void Move(float,float,float);//(沿着摄像机的3轴)移动
void SetPos(float,float,float);//设置摄像机的位置
D3DXVECTOR3 GetPos();//取得位置
void Rotate(float,float,float);//(围绕摄像机的3轴)旋转
void RotateByWorld(float,float,float);//围绕世界坐标系的轴旋转
D3DXMATRIX GetViewMat();//取得视变换的矩阵
private:
D3DXVECTOR3 m_Pos;
D3DXVECTOR3 m_Look;
D3DXVECTOR3 m_Up;
D3DXVECTOR3 m_Right;
void CheckRightUpLook();//重新归一化,正交化Look,Up,重新计算出Right.
};
//Camera.cpp
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#include <d3d9.h>
#include <d3dx9.h>
#include "Camera.h"
void Vec3MulMat(D3DXVECTOR3* ret,D3DXVECTOR3* v,D3DXMATRIX* m)
{
ret->x = v->x * m->_11 + v->y * m->_21 + v->z * m->_31;
ret->y = v->x * m->_12 + v->y * m->_22 + v->z * m->_32;
ret->z = v->x * m->_13 + v->y * m->_23 + v->z * m->_33;
}
void CreateViewMat(D3DXMATRIX* mat,D3DXVECTOR3* pos,D3DXVECTOR3* right,D3DXVECTOR3* up,D3DXVECTOR3* look)
{
mat->_11=right->x; mat->_12=up->x; mat->_13=look->x; mat->_14=0;
mat->_21=right->y; mat->_22=up->y; mat->_23=look->y; mat->_24=0;
mat->_31=right->z; mat->_32=up->z; mat->_33=look->z; mat->_34=0;
mat->_41=-D3DXVec3Dot(pos,right); mat->_42=-D3DXVec3Dot(pos,up); mat->_43=-D3DXVec3Dot(pos,look); mat->_44=1;
}
void CCamera::CheckRightUpLook()//还有另一种方法。。。
{
D3DXVec3Normalize(&m_Look,&m_Look);
m_Up=m_Up-m_Look*D3DXVec3Dot(&m_Up,&m_Look);
D3DXVec3Normalize(&m_Up,&m_Up);
D3DXVec3Cross(&m_Right,&m_Up,&m_Look);
}
void MoveOnAxis(D3DXVECTOR3* dest,D3DXVECTOR3* axis,D3DXVECTOR3* pos,float deltaS)
{
D3DXVECTOR3 tmp;
D3DXVec3Normalize(&tmp,axis);
*dest=tmp*deltaS+*pos;
}
void RotateWithAxis(D3DXVECTOR3* ret,D3DXVECTOR3* vec,D3DXVECTOR3* axis,float sita)
{
D3DXMATRIX mat;
D3DXMatrixRotationAxis(&mat,axis,sita);
Vec3MulMat(ret,vec,&mat);
}
D3DXVECTOR3 CCamera::GetPos()
{
return m_Pos;
}
void CCamera::MoveByWorld(float dx,float dy,float dz)
{
m_Pos.x+=dx;m_Pos.y+=dy;m_Pos.z+=dz;
}
void CCamera::SetPos(float x,float y,float z)
{
m_Pos.x=x;m_Pos.y=y;m_Pos.z=z;
}
void CCamera::RotateByWorld(float x,float y,float z)
{
D3DXMATRIX mat;
if(x)
{
D3DXMatrixRotationX(&mat,x);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
if(y)
{
D3DXMatrixRotationY(&mat,y);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
if(z)
{
D3DXMatrixRotationZ(&mat,z);
Vec3MulMat(&m_Look,&m_Look,&mat);
Vec3MulMat(&m_Up,&m_Up,&mat);
}
}
void CCamera::Rotate(float x,float y,float z)
{
if(x)
{
RotateWithAxis(&m_Look,&m_Look,&m_Right,x);
RotateWithAxis(&m_Up,&m_Up,&m_Right,x);
}
if(y)
{
RotateWithAxis(&m_Look,&m_Look,&m_Up,y);
RotateWithAxis(&m_Up,&m_Up,&m_Up,y);
}
if(z)
{
RotateWithAxis(&m_Look,&m_Look,&m_Look,z);
RotateWithAxis(&m_Up,&m_Up,&m_Look,z);
}
CheckRightUpLook();
}
void CCamera::Move(float dx,float dy,float dz)
{
if(dx)MoveOnAxis(&m_Pos,&m_Right,&m_Pos,dx);
if(dy)MoveOnAxis(&m_Pos,&m_Up,&m_Pos,dy);
if(dz)MoveOnAxis(&m_Pos,&m_Look,&m_Pos,dz);
}
D3DXMATRIX CCamera::GetViewMat()
{
D3DXMATRIX ret;
CreateViewMat(&ret,&m_Pos,&m_Right,&m_Up,&m_Look);
return ret;
}
CCamera::CCamera(float x,float y,float z)
{
m_Pos.x=x;
m_Pos.y=y;
m_Pos.z=z;
m_Up.x=0.0f;
m_Up.y=1.0f;
m_Up.z=0.0f;
m_Look.x=0.0f;
m_Look.y=0.0f;
m_Look.z=1.0f;
m_Right.x=1.0f;
m_Right.y=0.0f;
m_Right.z=0.0f;
}
CCamera::CCamera(D3DXVECTOR3* pos,D3DXVECTOR3* look,D3DXVECTOR3* up)
{
m_Pos=*pos;
m_Up=*up;
m_Look=*look;
CheckRightUpLook();
}
|
|