相对于旋转重置位置

时间:2016-07-23 16:49:57

标签: c# unity3d

目前我有以下两个问题:

  • 第一个问题是,当我重置相机位置时,我还必须重置相机旋转。这是因为我的相机 偏移设置为z和y上稍微偏离我的播放器的位置 轴和显然这些值应根据我的相机而改变 旋转,虽然我不确定如何弄清楚那些价值观 应该。

  • 我的第二个问题是我的轮播使用光线投影来查找中间部分 屏幕并确定它的旋转原点,虽然它似乎是 当旋转旋转时,略微偏离屏幕中间 如果它确实位于屏幕中间,原点也会移动 不应该完全静止吗?还有一个更好,更少 实现我想要的轮换的昂贵方式?

相关的代码:

void RotateCamera()
{
    //Find midle of screen
    Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
    RaycastHit hitInfo;

    //Checks if ray hit something
    if (Physics.Raycast(ray, out hitInfo))
    {
        //Rotate left and right
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.RotateAround(hitInfo.point, -Vector3.up, rotationSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.RotateAround(hitInfo.point, Vector3.up, rotationSpeed * Time.deltaTime);
        }
    }

    //Draws Raycast
    Debug.DrawRay(ray.origin, ray.direction * 100, Color.yellow);
}

void ResetCameraPosition()
{
    //Reset and lock camera position
    transform.rotation = Quaternion.identity;
    transform.position = player.transform.position + cameraOffset;

}

Image displaying what I mean

1 个答案:

答案 0 :(得分:0)

使用Camera.ScreenToWorldPoint创建一个'目标'在屏幕中间绕其转动。删除所有不需要的光线投射内容,并用以下内容替换相关位:

float rotationSpeed = 45; // or whatever speed
float distance = 5f; // or whatever radius for the orbit
Vector3 target = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width / 2, Screen.height / 2, distance));

if (Input.GetKey(KeyCode.RightArrow))
{
    transform.RotateAround(target , -Vector3.up, rotationSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
    transform.RotateAround(target , Vector3.up, rotationSpeed * Time.deltaTime);
}