Final working code for anyone that is interested in implementing something similar.
Code:
void CCamera::RotateTo(D3DXVECTOR3 vecTarget)
{
//vecTarget must share origin with camera vector
D3DXVec3Normalize(&m_vecTarget,&vecTarget);
D3DXVECTOR3 nPos;
D3DXVec3Normalize(&nPos,&Pos);
D3DXVec3Normalize(&vecTarget,&vecTarget);
D3DXVECTOR3 toTarget=nPos-vecTarget;
D3DXVec3Normalize(&toTarget,&toTarget);
//Normalize look
D3DXVECTOR3 nLook;
D3DXVec3Normalize(&nLook,&Look);
//Cross product is axis of rotation
D3DXVec3Cross(&m_vecAxis,&toTarget,&nLook);
//Dot product is cos of angle of rotation
m_fAxisAngle=Clamp(-D3DXVec3Dot(&toTarget,&nLook),-1,1);
//Construct axis angle rotation matrix
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T,&m_vecAxis,acosf(m_fAxisAngle));
//Compute destination right, up, and look vectors and save in class members
//OrgRt * T = DestRt
//OrgUp * T=DestUp
//OrgLk * T=DestLk
D3DXVec3TransformCoord(&m_vecTargUp,&Up,&T);
D3DXVec3TransformCoord(&m_vecTargLook,&Look,&T);
D3DXVec3TransformCoord(&m_vecTargRight,&Right,&T);
//Hard-coded LERP - later to be based on fastest angular rotation of current ship or camera
m_fLERP=0.0015f;
//Not used yet
m_fCurLERP=0.0f;
}
void CCamera::UpdateRotation()
{
//Interpolate between current up, right, and look vectors and target up, right, and look vectors by m_fLerp
//Save result of interpolation back into current up, right, and look vectors
D3DXVec3Lerp(&Right,&Right,&m_vecTargRight,m_fLERP);
D3DXVec3Lerp(&Up,&Up,&m_vecTargUp,m_fLERP);
D3DXVec3Lerp(&Look,&Look,&m_vecTargLook,m_fLERP);
}
The linear interpolation works without changing m_fLerp because I'm constantly changing the origin vectors. So the origin gets closer and closer to the target vector without changing the lerp value.