|
|
发表于 2006-4-23 18:29:00
|
显示全部楼层
Re:跪求 第一人称视角变换 演示代码 DX版的
//CAM是个矩阵,用于把世界坐标系的物体变换到相机空间
Camera::Camera(CameraType cameraType)
{
_cameraType = cameraType;
_pos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
_right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
_up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
_look = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
}
Camera::~Camera()
{
}
//============== 水平运动
void Camera::walk(float units)//========= walk 行走。。。。对应前后平移
{
// 只在xz水平面上运动
_pos += D3DXVECTOR3(_look.x, 0.0f, _look.z) * units;
}
void Camera::strafe(float units) //====== strafe 水平扫射。。。。对应左右平移运动
{
// 只在xz水平面上运动
_pos += D3DXVECTOR3(_right.x, 0.0f, _right.z) * units;
}
void Camera::fly(float units) //========= 对应上下平移
{
//只在y水平面上运动
_pos.y += units;
}
//============ 旋转运动
void Camera::pitch(float angle) //======= pitch 倾斜、倾斜度。。。。对应上下旋转
{
D3DXMATRIX T;
// 创建一个围绕任意轴(这里为 _right)旋转的矩阵
D3DXMatrixRotationAxis(&T, &_right, angle);
// 围绕 _right旋转 _up and _look 向量
D3DXVec3TransformCoord(&_up,&_up, &T);
D3DXVec3TransformCoord(&_look,&_look, &T);
}
void Camera::yaw(float angle)//========== yaw 偏移、偏航。。。对应左右旋转
{
D3DXMATRIX T;
// 总是围绕 y (0, 1, 0) 旋转
// 创建一个绕y轴旋转了angle角度的矩阵T
D3DXMatrixRotationY(&T, angle);
// 围绕 _up 或 y-轴旋转 _right and _look 向量
// 由给定的一个矩阵来变换一个3D向量
D3DXVec3TransformCoord(&_right,&_right, &T);
D3DXVec3TransformCoord(&_look,&_look, &T);
}
void Camera::getViewMatrix(D3DXMATRIX* V)
{
// Keep camera's axes orthogonal to eachother
D3DXVec3Normalize(&_look, &_look);
D3DXVec3Cross(&_up, &_look, &_right);
//up也是归一化的,用于标定方向
//pos + dir x n就等于以pos为起点,向dir方向前进n个单位
//这里的dir是方向,而且必须是归一化的 D3DXVec3Normalize(&_up, &_up);
D3DXVec3Cross(&_right, &_up, &_look);
D3DXVec3Normalize(&_right, &_right);
// Build the view matrix:
float x = -D3DXVec3Dot(&_right, &_pos);
//如果right和pos是归一化的,则表示right和pos两个矢量的夹角的cos值
float y = -D3DXVec3Dot(&_up, &_pos);
float z = -D3DXVec3Dot(&_look, &_pos);
(*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f;
//看做一个单位,比如就像1,n x 1 =n
(*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) = _look.y; (*V)(1, 3) = 0.0f;
(*V)(2,0) = _right.z; (*V)(2, 1) = _up.z; (*V)(2, 2) = _look.z; (*V)(2, 3) = 0.0f;
(*V)(3,0) = x; (*V)(3, 1) = y; (*V)(3, 2) = z; (*V)(3, 3) = 1.0f;
} |
|