C# 相对于旋转的重置位置

C# 相对于旋转的重置位置,c#,unity3d,C#,Unity3d,目前我有以下两个问题: 第一个问题是,当我重置相机位置时,我还必须重置相机旋转。这是因为我的相机 偏移设置为在z和y方向上稍微偏离我的播放机的位置 很明显,这些值应该根据我的相机而改变 旋转,尽管我不确定如何计算这些值 应该是 我的第二个问题是,我的旋转使用光线投射来查找图像的中间 屏幕并确定其旋转原点,尽管它似乎是 当屏幕旋转时,稍微偏离屏幕中部 原点也会移动,如果它确实在屏幕中间。 它不应该完全静止吗?还有更好的和更少的吗 实现我想要的轮换的昂贵方式 相关代码: void RotateC

目前我有以下两个问题:

  • 第一个问题是,当我重置相机位置时,我还必须重置相机旋转。这是因为我的相机 偏移设置为在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;

}

用于在屏幕中间创建一个“目标”来围绕它旋转。移除所有不需要的光线投射内容,并将相关位替换为:

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);
}

用于在屏幕中间创建一个“目标”,以围绕它旋转。移除所有不需要的光线投射内容,并将相关位替换为:

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);
}

你能再解释一下你到底想让相机做什么吗?我想我明白了,你想围绕一个点旋转,并按需重置为当前面对的玩家,但请确认。是的,一张屏幕截图或一幅画(甚至是程序员的艺术)将有助于lot@Absinthe对对不起,基本上是这样的,我想把相机旋转到屏幕的中间,所以它基本上是围绕它所看到的东西旋转的,我现在的代码做的很好,但是旋转时它的焦点会稍微移动,这似乎是一种昂贵的计算方法。至于重置旋转部分,我希望将我的相机重置为它已经旋转的方式,尽管它的位置可以看到我的角色。希望这能把事情弄清楚。谢谢@马克:谢谢,我一定会加上的!这里有一个使用Mathf.SmoothDampAngle实现这种轨道凸轮的好例子。我认为你根本不需要光线投射,只需要为相机设置一个目标,例如球员的变换。你能再解释一下你到底想要相机做什么吗?我想我明白了,你想围绕一个点旋转,并按需重置为当前面对的玩家,但请确认。是的,一张屏幕截图或一幅画(甚至是程序员的艺术)将有助于lot@Absinthe对对不起,基本上是这样的,我想把相机旋转到屏幕的中间,所以它基本上是围绕它所看到的东西旋转的,我现在的代码做的很好,但是旋转时它的焦点会稍微移动,这似乎是一种昂贵的计算方法。至于重置旋转部分,我希望将我的相机重置为它已经旋转的方式,尽管它的位置可以看到我的角色。希望这能把事情弄清楚。谢谢@马克:谢谢,我一定会加上的!这里有一个使用Mathf.SmoothDampAngle实现这种轨道凸轮的好例子。我认为你根本不需要光线投射,只需为相机设置一个目标,例如玩家的变换。该代码的问题是我不知道我的距离,因此光线投射,它也不能回答我问题的第一部分和主要部分。该代码的问题是我不知道我的距离,因此光线投射,而且它也没有回答我问题的第一部分和主要部分。