Как остановить вращение камеры?

Я сделал предшественник своей игры 3d Agario. Это игра, ориентированная на мышь. Вы используете мышь, чтобы контролировать большую часть движения. Это включает в себя поворот камеры.

Моя проблема в том, что камера не перестает вращаться. Это связано с тем, что очень сложно центрировать мышь по центру экрана, и я сделал поворот камеры с помощью уравнения синуса.

Вот мой код:

//public
public GameObject player;
public float rotationSpeed;

//v3
private Vector3 mousePos;
private Vector3 playerPos;
private Vector3 camPos;

//float
private float sideX;
private float sideZ;
private float sideC;
private float camX;
private float camZ;
private float camC;
private float rotX;
private float rotZ;
private float rotC;
private float rotAngle;
private Quaternion currRotation;

//camera
private Camera hitCam;

void Start ()
{
    transform.rotation = Quaternion.Euler(30, 0, 0);
    transform.position = new Vector3(0, 15, 0);
}
void LateUpdate ()
{
    mousePos = HitCameraController.mousePos;
    playerPos = player.transform.position;

    sideX = (mousePos.x - playerPos.x);
    sideZ = (mousePos.z - playerPos.z);
    sideC = (Mathf.Sqrt(Mathf.Pow(sideX, 2) + Mathf.Pow(sideZ, 2)));

    camC = 15;
    camX = (camC * sideX) / sideC;
    camZ = (camC * sideZ) / sideC;

    rotX = (sideX + camX);
    rotZ = (sideZ + camZ);
    rotC = (Mathf.Sqrt(Mathf.Pow(rotX, 2) + Mathf.Pow(rotZ, 2)));

    if (rotX >= 0 && rotZ >= 0)
    {
        rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX >= 0 && rotZ <= 0)
    {
        rotAngle = 180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX <= 0 && rotZ >= 0)
    {
        rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX <= 0 && rotZ <= 0)
    {
        rotAngle = -180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    camPos = new Vector3((playerPos.x - camX), 15, (playerPos.z - camZ));
    currRotation = Quaternion.Euler(30, rotAngle, 0);

    // Move Camera
    transform.position = camPos;

    // Rotate Camera

    /*transform.rotation = Quaternion.RotateTowards(
        transform.rotation, currRotation, 
        (rotationSpeed * Time.deltaTime));*/

    transform.rotation = currRotation;
}

Я хочу сделать своего рода «безопасную зону», которая предотвратит вычисление угла поворота. Например, если я держу указатель мыши в пределах определенной границы в центре, камера не будет вращаться.

Я попытался установить границу с помощью оператора «или», но это не дало мне результата, который я искал (камера все равно вращалась, даже когда моя мышь находилась на границе. Камера останавливалась при некоторых попытках, но перед этим он будет сильно дрожать.)

Я точно знаю, почему это происходит: луч не попадает на фотоаппарат; следовательно, координата мыши всегда будет меняться, даже если я не перемещаю мышь. Я попытался направить луч на камеру "Hit" (неподвижную камеру), но камера слежения не могла уловить движение мыши. Я не знаю, как решить эту проблему, кроме как продолжать мозговой штурм в поисках интуитивно понятного решения, но мой мозг может только так много инноваций.

Если вы могли придумать решение до меня, дайте мне знать любым способом.


person Bradley William Elko    schedule 23.01.2018    source источник


Ответы (1)


person    schedule
comment
Игрок в центре, но проблема в том, что sideC никогда не будет меньше 0, потому что это sqrt. И я хочу, чтобы безопасная зона была в 5 единицах от центра камеры в обоих направлениях. - person Bradley William Elko; 23.01.2018
comment
Я, конечно, соскучился по sqrt. Тогда вам даже не нужно if-else. Просто вычтите 5 (может быть, вам нужно вычесть 5²?) И проверьте, > 0. Обязательно вычитайте то же самое при вычислении вращения, чтобы избежать резкости при выходе из безопасной зоны. - person KYL3R; 24.01.2018
comment
Можешь переписать ответ? - person Bradley William Elko; 24.01.2018
comment
Я изменил свой ответ - person KYL3R; 25.01.2018
comment
Сообщаю вам, что я отказался от дальнейшего прогресса в этой игре и начал делать новую игру. : / Эта игра будет слишком сложной, чтобы ее рационализировать. - person Bradley William Elko; 29.01.2018
comment
Может быть, проще избежать обратного вычисления с синусом и косинусом. Возможно, вы установили радиус экранного пространства, чтобы работать только с mousePosition. - person KYL3R; 12.02.2018