0
votes

I'm making a topdown game with the camera at 40 degree angle. What I want to do is when i click an gameobject, It will move the camera and position the object at the left side from the center of the camera view regardless of its rotation. So that I can place a menu at the right side. How do I get the offset of the angled camera so that the object is in the middle left side of the camera view?

Right now i use lerp but it overshoots the target because of the cameras angle. Sorry for the noob question I'm new to unity3d.

transform.position = Vector3.Lerp(transform.position, new Vector3(target.transform.position.x, transform.position.y, target.transform.position.z), 0.1f);

enter image description here

1

1 Answers

2
votes

First of all you should start by finding point that your camera will move/lerp to.

In your case in can be simplified to 2D-Space:

point P you're looking for

It shouldnt be tough to find that one.

  1. Use transform.forward of camera to get vector (Vector3 cameraDir) of direction your camera is looking at

  2. Rotate by horizontal fov / 4 around y axis:

Vector3 cameraDirRotated = Quaternion.AngleAxis(hFov/4f, Vector3.up) * cameraDir;

enter image description here

  1. -cameraDirRotated will be vector from Cube To point P you're looking for, u can also scale it: Vector3 PtoMoveTo = cube.transform.position - cameraDirRotated.normalized * 5f;

Full:

Vector3 FindCameraTarget(Transform targetObj, float hFov)
{
    Vector3 cameraDir = transform.forward;
    Vector3 cameraDirRotated = Quaternion.AngleAxis(hFov / 4f, Vector3.up) * cameraDir;
    Vector3 target = targetObj.transform.position - cameraDirRotated.normalized * 5f;
    return target;
}

Then:

transform.position = Vector3.Lerp(transform.position, FindCameraTarget(target, 90f) , 2f * Time.deltaTime);

For performance u can save that target vector once if Cube is not moving. Search web how to precisely count horizontal fov. Multiply speed by Time.timeDelta if u lerp in Update().