Well infact its really simple, I just make sure the camera doesnt leave the origin (0, 0, 0). The vibrating effect is caused from floating point numbers becoming really inaccurate when they become big.
How I do this is when every object is updated, I translate all of them at minus the camera position, then I position the camera at 0, 0, 0; it seems your camera is moving but infact its always at the origin. Make sure you stick a function for this at the end of your loop or you could get some strange artifacts.
Heres the GDK code for this workaround in 2 functions:
void updateCamera( double CameraPosX , double CameraPosY , double CameraPosZ )
{
shiftAllObjects( -CameraPosX , -CameraPosY , -CameraPosZ );
dbPositionCamera( 0 , 0 , 0 );
}
void shiftAllObjects( double ShiftX , double ShiftY , double ShiftZ )
{
for( int Object=1; Object<=99999; Object++ )
{
if( dbObjectExist( Object ) )
{
dbPositionObject( Object , dbObjectPositionX( Object ) + ShiftX ,
dbObjectPositionY( Object ) + ShiftY ,
dbObjectPositionZ( Object ) + ShiftZ );
}
}
for( int Light=1; Light<=8; Light++ )
{
if( dbLightExist( Light ) )
{
dbPositionLight( Light , dbLightPositionX( Light ) + ShiftX ,
dbLightPositionY( Light ) + ShiftY ,
dbLightPositionZ( Light ) + ShiftZ );
}
}
}