To be honest, I expected more (by reading the headline).

Its nice that you share your code (and I'm sure someone will copy and paste it) but I wouldnt advice it for several reasons. I dont know your programming skills. So, if you are a beginner, its okay.

Some things I would do a bit different:
  • seperate the player code from the camera code, put all camera code in one function and call it each frame
  • your lag is done explicitely: instead of doing it by a variable that serves as lag by holding an angle which is decreased, you should let it work implicitely: the camera knows an offset and some angle parameters such as tilt and maybe arcus, but the lag is done between current cam position, calculated cam position and a interpolated position done by factor*time_step (i.e. 0.1*time_step) and vec_lerp. This is much more natural and dynamic
  • your camera collision is not a real collision: its more a worse exception. I'm sorry, but tilting it upwards is an ugly workaround. You will have more success by using one or two trace rays to determine a) collides my camera with a wall and b) where can I place my camera instead. Imagine you would move inside a room: you won't have an chance with your tilt solution.
  • try to rotate and move your player with accelerate: at the moment the model moves too mechanic


When you focus more on these alternative approaches, I'm sure, its the lesson worth it and you could re-release a second demo for contribution.