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

Я сделал предшественник моей 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" (неподвижную камеру), но следующая камера не могла уловить движение мыши. Я не знаю, как решить эту проблему, кроме как продолжать мозговые штурмы для интуитивного решения, но мой мозг может только так много изобретать.

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

1 ответ

[...]
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)));

    // New Stuff
    sideC -= 5f; // substract the safe-zone-radius
    if(sideC < 0f)
    {
        // Inside safe-zone, do nothing.
        sideC = 0f;
        sideX = 0f;
        sideZ = 0f;
    }else{
        // Outside safe-zone, correct values to avoid jumping.
        float x_ratio = sideX / sideZ; // be careful with "divide by zero"
        float z_ratio = sideZ / sideX;
        sideX -= 5 * x_ratio;
        sideZ -= 5 * z_ratio;
    }
    // End New Stuff

    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);
Другие вопросы по тегам