团结:使用余弦定律旋转相机

时间:2017-12-11 18:24:13

标签: c# unity3d camera euler-angles cos

我正在为面向鼠标的游戏制作基本控件。我希望相机跟随播放器并使用余弦定律围绕播放器旋转以找到角度。这是我的代码:

//Move Camera
camX = player.transform.position.x;
camY = 15.5f;
camZ = player.transform.position.z;

//Rotate Camera
rotTriA = player.transform.position.x;
rotTriB = player.transform.position.z;
rotTriC = Mathf.Sqrt((rotTriA * rotTriA) + (rotTriB + rotTriB));

if(rotTriA > 0 && rotTriB > 0)
{
    getAngle = (Mathf.Acos(((rotTriA * rotTriA)
        + (rotTriB * rotTriB)
        - (rotTriC * rotTriC))
        / (2 * (rotTriA) * (rotTriB))) * Mathf.Rad2Deg);
}
else if(rotTriA > 0 && rotTriB < 0)
{
    getAngle = (Mathf.Acos(((rotTriA * rotTriA)
        + (rotTriB * rotTriB)
        - (rotTriC * rotTriC))
        / (2 * (rotTriA) * (rotTriB))) * Mathf.Rad2Deg) + 90;
}
else if(rotTriA < 0 && rotTriB < 0)
{
    getAngle = (Mathf.Acos(((rotTriA * rotTriA)
        + (rotTriB * rotTriB)
        - (rotTriC * rotTriC))
        / (2 * (rotTriA) * (rotTriB))) * Mathf.Rad2Deg) + 180;
}
else if(rotTriA < 0 && rotTriB > 0)
{
    getAngle = (Mathf.Acos(((rotTriA * rotTriA)
        + (rotTriB * rotTriB)
        - (rotTriC * rotTriC))
        / (2 * (rotTriA) * (rotTriB))) * Mathf.Rad2Deg) + 270;
}
else if(rotTriA == 0 && rotTriB > 0)
{
    getAngle = 90;
}
else if(rotTriA == 0 && rotTriB < 0)
{
    getAngle = 270;
}
else if(rotTriA > 0 && rotTriB == 0)
{
    getAngle = 0;
}
else if(rotTriA < 0 && rotTriB == 0)
{
    getAngle = 180;    
}
else
{
    getAngle = 0;
}

Debug.Log(getAngle);

if (camZ < 0)
{
    camZ = player.transform.position.z + 10.5f;
    transform.eulerAngles = new Vector3(135f, getAngle, 0.0f);
}
else
{
    camZ = player.transform.position.z - 10.5f;
    transform.eulerAngles = new Vector3(45f, getAngle, 0.0f);
}
camZ = player.transform.position.z - 15.5f;
cam = new Vector3(-camX, camY, camZ);
mainCamera.transform.position = cam;

我知道如何让相机跟随播放器,但我不知道如何让相机在播放器周围旋转而不会吓坏它。

可能发生这种情况的原因:我正在使用光线投射来移动玩家,所以当我将鼠标移动到竞技场之外时,动作不会记录,我可能不会正确地执行余弦定律,因为我得到了价值到400(这是不可能的,给定一个圆是360度)。

1 个答案:

答案 0 :(得分:0)

使相机围绕播放器旋转的最简单方法是利用游戏对象层次结构。

首先制作一个空的GameObject,然后让你的相机成为它的孩子:

EmptyObject
  > Camera

现在定位相机以查看空物体的位置。这个空物体的位置现在是你的相机所在的位置&#34;寻找&#34;。由于相机是儿童,如果旋转此物体,相机会围绕它旋转(同时保持面向空物体的方向)。

一个简单的旋转空对象的脚本,由于变换育儿,可以使相机跟踪#34;在看着它的时候围着它:

using UnityEngine;

public class CameraInput : MonoBehaviour
{
    [SerializeField] private float rotationAcceleration; // radians/(frame^2)
    [SerializeField] private float rotationSpeedMax; // radians/frame
    [SerializeField] private float rotationDamping; // 0.99

    private float rotationSpeed;

    private void Awake()
    {
        rotationSpeed = rotationSpeedMax / 4;
    }

    private void Update()
    {
        if (Input.GetKey(KeyCode.A))
        {
            rotationSpeed += rotationAcceleration;
        }
        if (Input.GetKey(KeyCode.D))
        {
            rotationSpeed -= rotationAcceleration;
        }

        rotationSpeed = Mathf.Clamp(
            rotationSpeed, -rotationSpeedMax, rotationSpeedMax);

        transform.Rotate(0f, rotationSpeed, 0f);

        rotationSpeed *= rotationDamping;
    }
}

将这样的东西附加到EmptyObject对象就行了。现在你只需要这个空对象来跟随你的角色。旋转函数接受弧度作为参数,因此您将要使用小的[0.00~0.01]数字。此外,这是一个每帧实现,因此它只能在您的帧速率平滑的情况下顺利运行;你最终想要Time.deltaTime因素。