D3DXVECTOR3 RelativePosition(const D3DXVECTOR3 *src,const D3DXVECTOR3 *origin,
const D3DXVECTOR3 *target,const D3DXVECTOR3 *upvector)
{
D3DXVECTOR3 dirn;
D3DXVec3Normalize(&dirn,&D3DXVECTOR3(*target-*origin));
D3DXVECTOR3 u;
D3DXVec3Cross(&u, &dirn, upvector);
D3DXVec3Normalize(&u,&u);
D3DXVECTOR3 v;
D3DXVec3Cross(&v,&u,&dirn);
D3DXVECTOR3 originToSrc=*origin-*src;
return D3DXVECTOR3( D3DXVec3Dot(&u,&originToSrc), D3DXVec3Dot(&v,&originToSrc),
D3DXVec3Dot(&dirn,&originToSrc) );
}
void SetCameraShift(D3DXVECTOR3 *cam,D3DXVECTOR3 *camtarg,
const D3DXVECTOR3 *shift,const D3DXVECTOR3 *upvector)
{
D3DXVECTOR3 dirn;
D3DXVec3Normalize(&dirn,&D3DXVECTOR3(*camtarg-*cam));
D3DXVECTOR3 u;
D3DXVec3Cross(&u, &dirn, upvector);
D3DXVec3Normalize(&u,&u);
D3DXVECTOR3 v;
D3DXVec3Cross(&v,&u,&dirn);
*cam += u*(shift->x) + v*(shift->y) + dirn*(shift->z);
*camtarg += u*(shift->x) + v*(shift->y) + dirn*(shift->z);
}
void SetCameraRotationX(const D3DXVECTOR3 *cam,D3DXVECTOR3 *camtarg,
const D3DXVECTOR3 *upvector, const float angle)
{
D3DXVECTOR3 dirn;
D3DXVec3Normalize(&dirn,&D3DXVECTOR3(*camtarg-*cam));
D3DXVECTOR3 u;
D3DXVec3Cross(&u, &dirn, upvector);
D3DXVec3Normalize(&u,&u);
D3DXMATRIX rotmatrix;
D3DXMatrixRotationAxis(&rotmatrix,&u,angle);
D3DXVec3TransformCoord(&dirn,&dirn,&rotmatrix);
*camtarg=*cam+dirn;
}
void SetCameraRotationY(const D3DXVECTOR3 *cam,D3DXVECTOR3 *camtarg,
const D3DXVECTOR3 *upvector, const float angle)
{
D3DXVECTOR3 dirn;
D3DXVec3Normalize(&dirn,&D3DXVECTOR3(*camtarg-*cam));
D3DXVECTOR3 u;
D3DXVec3Cross(&u, &dirn, &D3DXVECTOR3(0.0f,1.0f,0.0f));
D3DXVec3Normalize(&u,&u);
D3DXVECTOR3 v;
D3DXVec3Cross(&v,&u,&dirn);
D3DXMATRIX rotmatrix;
D3DXMatrixRotationAxis(&rotmatrix,&v,angle);
D3DXVec3TransformCoord(&dirn,&dirn,&rotmatrix);
*camtarg=*cam+dirn;
}