You can also move the camera by holding [alt] plus an arrow key, It seems to me that mapping this to the "Hat" or castle switch would be easy.
You could only control pitch and roll, but not yaw, since you have only two axis on your mouse.
There's a utility that just might do the trick. It's called Mouse Raider. It converts mouse movements to keystrokes. Originally designed for use with the old Tomb Raider games, but it might just work for Orbiter. Haven't tested it though.
You can get it here;
http://mouseraider.homepage.t-online.de/
You might want to check again, it works on my computer both interior and exterior
(Running 2010 p1 on windows 7 laptop)
This is very old but just wanted to say thank for this man with his amazing code @computerex sounds pretty complete for quick and dirty method btwQuick and dirty: Dump the .dll in the modules\plugin folder, activate it in the launch pad. Press ALT+M to toggle between mouse input/keyboard input. Only supports rotational RCS mode+Atmospheric control surfaces. Hold down left mouse button for yaw.
Code:#define STRICT #define ORBITER_MODULE #include <orbitersdk.h> HWND hwnd = 0; float width, height; bool enable = false; NOTEHANDLE title; DLLCLBK void opcOpenRenderViewport(HWND hWnd, DWORD w, DWORD h, BOOL fc) { hwnd=hWnd; width=(float)w;height=(float)h; title = oapiCreateAnnotation(false, 0.8, _V(0.0, 1.0, 0.0)); oapiAnnotationSetPos(title, 0.84, 0.06, 1.0, 0.3); oapiAnnotationSetText(title, "Attitude: Standard"); } double lpt = 0; DLLCLBK void opcPreStep(double simt, double simdt, double mjd) { if ( GetAsyncKeyState(VK_MENU) && GetAsyncKeyState(0x4D) && simt > lpt){ enable = !enable; if ( !enable ) { VESSEL * v = oapiGetFocusInterface(); DWORD cnt = v->GetThrusterCount(); THRUSTER_HANDLE th; for ( unsigned int i = 0; i < cnt; i++ ) { th = v->GetThrusterHandleByIndex(i); v->SetThrusterLevel(th, 0); } v->SetADCtrlMode(7); oapiAnnotationSetText(title, "Attitude: Standard"); }else oapiAnnotationSetText(title, "Attitude: Mouse"); lpt = simt+0.2; } if ( !enable ) return; RECT rect; POINT cpos, crpos; GetWindowRect(hwnd, &rect); GetCursorPos(&cpos); if ( cpos.x > rect.right || cpos.x < rect.left ) return; if ( cpos.y > rect.bottom || cpos.y < rect.top ) return; crpos.x = cpos.x-rect.left; crpos.y = cpos.y-rect.top; float cx = width/2.0f, cy = height/2.0f; float pi = (crpos.y-cy)/cy; float bi = (crpos.x-cx)/cx; bool mbd = GetAsyncKeyState(0x01); VESSEL * v = oapiGetFocusInterface(); int atmode = v->GetAttitudeMode(); v->SetADCtrlMode( 7 ); v->SetControlSurfaceLevel(AIRCTRL_ELEVATOR, pi); v->SetControlSurfaceLevel((mbd?AIRCTRL_RUDDER:AIRCTRL_AILERON), bi); if ( atmode == ATTMODE_ROT ){ v->SetThrusterGroupLevel((pi>0?THGROUP_ATT_PITCHUP:THGROUP_ATT_PITCHDOWN), (pi>0?pi:-pi)); v->SetThrusterGroupLevel((mbd?(bi>0?THGROUP_ATT_YAWLEFT:THGROUP_ATT_YAWRIGHT): (bi>0?THGROUP_ATT_BANKRIGHT:THGROUP_ATT_BANKLEFT)), (bi>0?bi:-bi)); }else { v->SetThrusterGroupLevel(THGROUP_ATT_PITCHUP, 0); v->SetThrusterGroupLevel(THGROUP_ATT_PITCHDOWN,0); v->SetThrusterGroupLevel(THGROUP_ATT_YAWLEFT, 0); v->SetThrusterGroupLevel(THGROUP_ATT_YAWRIGHT, 0); v->SetThrusterGroupLevel(THGROUP_ATT_BANKLEFT, 0); v->SetThrusterGroupLevel(THGROUP_ATT_BANKRIGHT,0); } if ( !mbd ) { v->SetControlSurfaceLevel(AIRCTRL_RUDDER, 0); if ( atmode == ATTMODE_ROT ){ v->SetThrusterGroupLevel(THGROUP_ATT_YAWLEFT, 0); v->SetThrusterGroupLevel(THGROUP_ATT_YAWRIGHT, 0); } }else { v->SetControlSurfaceLevel(AIRCTRL_AILERON, 0); if ( atmode == ATTMODE_ROT ){ v->SetThrusterGroupLevel(THGROUP_ATT_BANKLEFT, 0); v->SetThrusterGroupLevel(THGROUP_ATT_BANKRIGHT, 0); } } v->SetADCtrlMode(0); }