What you’ve got requested for is straightforward:
Just draw a circle round your preliminary focus level, whose radius is the same as your digicam’s distance from the purpose, so the circle crosses your digicam’s axis on the digicam’s place.
Now draw a circle with the identical radius round your shifted level. The (as much as two) factors the place this crosses the digicam’s ahead axis are the factors which might be the identical distance away as the unique level was from the digicam.
You can discover the closest of those two factors with a “ray versus circle intersection take a look at” — search these key phrases to search out present solutions right here displaying the maths. In 3D, it is a ray vs sphere intersection take a look at, however the math is just about an identical.
But there’s a danger that this second circle/sphere sits completely on one facet of the digicam’s axis and by no means crosses it. In this case, no precise resolution exists, and the most effective you are able to do is fall again to the closest level on the road, or rotate/strafe your digicam to comply with the purpose.
What I believe you truly need is even simpler although:
If you are doing this to attempt to management the quantity of perspective scaling an object at that time experiences by the digicam’s linear perspective lens, then it is necessary to notice that this scaling varies primarily based on the depth to the purpose, not the distance. That is, take the displacement vector between the digicam and the purpose, and measure solely the element parallel to the digicam’s ahead axis, not its whole diagonal size.
This is each simpler to compute, and assured to all the time have an actual resolution, so you do not want a fallback technique like when the road misses the sphere.
Vector3 pointShift = point2position - point1position; float depthShift = Vector3.Dot(pointShift, digicam.ahead); digicam.place += digicam.ahead * depthShift;
digicam.ahead is a unit vector within the path the digicam is trying.
If you are all the time attempting to take care of some fastened depth, this model might be extra numerically secure and stop accumulating rounding errors by taking the goal depth as an enter:
float currentDepth = Vector3.Dot(point2position - cameraPosition, digicam.ahead); float error = currentDepth - targetDepth; digicam.place += digicam.ahead * error;