1
\$\begingroup\$

I have a camera that currently smoothly (ease in and out) linearly interpolates between two positions. The camera also moves in response to user input.

While this movement is nice and smooth it does not feel natural. My goal is to add some sort of feeling of inertia or natural movement or hand-heldedness to it.

Therefore I have been trying to generate a formula that simulates more natural camera movement on top of the interpolation and user control. Thus far I have not had success.

In one try I pretended that the camera had a stick going out of it and that at the end a ball was attached to a spring attached so said stick. This ball was then focused on adding some direction animation to the system... however I could never get this right. The camera would be shaky/oscillating and user movements looked really awful.

I also tried having the direction point towards a slower animated pole.

No such luck.

Why do these methods of generating a more natural 3D camera movements not work? What is usually used to make this work.

\$\endgroup\$
1
  • \$\begingroup\$ Would it be possible to have a small gif on how the current camera renders? And more natural is always subjective. The brain is doing a lot of interpolation on shaky images (when you move) vs when you watch a video with a head mounted camera (or any "amateur" camera film like Blair Witch Project \$\endgroup\$
    – Zibelas
    Sep 9, 2020 at 9:08

2 Answers 2

1
\$\begingroup\$

Think of the physics of holding a camera. Is it a heavy or a light-weight camera? A heavy one will require more energy to move and rotate, so it will naturally move slower, and thus smoother.

Assuming you have a hand-held camera, you are standing somewhere and pointing it at some position. Then there are two things you can do: you can start walking or running with the camera in some direction, while keeping the orientation of the camera, or you can stand still and rotate the camera until it points to something else. So there's translation of the camera's origin, and a rotation of the camera's pointing vector.

Both of these parameters will not change instantly, and as you have discovered, also not with a linear interpolation. The reason linear interpolation is bad is that during the motion it is too smooth to be natural, and right at the beginning and end of the motion there is a discontinuity. Instead of linear interpolation, you want to use a function that has a more natural smoothness. What you want to do is limit the acceleration of the change in the parameter, or to put it more mathematically, limit its second derivative.

Instead of trying to model it as a mathematical function, I would keep track of the current value of the position and rotation parameters, and the speed at which they are currently changing. Then, before rendering the next frame, you want to calculate a new speed, and then update the current value using the speed times the duration of the frame. To update the speed, just think of what you would do yourself when walking around with a camera: you will have some maximum speed you cannot exceed, and while you are not yet at the right position, you will increase the speed to do to the desired position faster (until you hit the maximum speed), and if you are almost at the target position you will decrease the speed. The latter might be hard to do correctly, but that's fine, a little overshoot might make it look more natural.

Add some noise to the speed variable at every time step to avoid having a camera that looks perfectly still. This will result in Brownian motion. The strength of it can be controlled with a constant that you tweak until you get the desired result. Or you can make that a variable parameter as well, for example increase it to simulate the person holding the camera being scared. The feedback loop mentioned above will ensure the camera will, on average, stay centered on the target.

\$\endgroup\$
0
\$\begingroup\$

You can try the Cinemachine (which can be found in the Package manager). Use its noise Component

enter image description here

Hope it helps. Let me know.

\$\endgroup\$
1
  • \$\begingroup\$ I am working within a custom environment so I don’t have the benefit of those settings \$\endgroup\$
    – J.Doe
    Sep 9, 2020 at 16:49

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .