【问题标题】:Unity - Rotate around object by mouseUnity - 用鼠标围绕对象旋转
【发布时间】:2020-04-16 22:16:36
【问题描述】:

我希望有人能帮我解决这个问题,我确实花了好几天的时间。

我需要将相机聚焦在物体的前面,然后让玩家在按住鼠标按钮的同时绕着物体旋转。我已经设法让相机聚焦在物体的前面,使用这个:

if (!arrived)
{
    //Centre on our object
    var newPos = target.transform.position + currentRotation * (distance * target.transform.forward);
    transform.position = Vector3.Lerp(transform.position, newPos, 0.25f);
    transform.LookAt(target.position);
    return;
}

但是我正在寻找被按住的鼠标按钮并尝试围绕目标对象旋转,与它保持一致的距离。

我尝试了很多不同的方法,但它们都有问题。

我试过了:

transform.RotateAround(target.position, Vector3.down, (movementForce * 100000) * Time.deltaTime);

但它在水平方向上可以正常工作,但使用 Vector.left 似乎在垂直方向上不起作用。

我试过了:

transform.LookAt(target.position);
Vector3 rotation = new Vector3(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"), 0);
transform.Translate(rotation * Time.deltaTime * 10);

但是随着时间的推移,这会使相机远离目标。

最后我没有尝试这个:

//Horizontal
Vector3 relativePos = target.position - transform.position; // Vector from camera to player
Vector3 relativePosRight = Vector3.Cross(relativePos, Vector3.left);
transform.RotateAround(target.position, relativePosRight, 100 * Time.deltaTime * Input.GetAxisRaw("Mouse X"));

//Vertical
Vector3 relativePos = target.position - transform.position; // Vector from camera to player
Vector3 relativePosRight = Vector3.Cross(relativePos,Vector3.up);
transform.RotateAround(target.position, relativePosRight, 100 * Time.deltaTime * Input.GetAxisRaw("Mouse Y"));

在垂直方向上效果很好,但是当水平移动鼠标时,这似乎也会影响垂直方向并且以奇怪的角度运行。

请原谅上述任何明显的错误,我实际上是通过复制和粘贴我在网上找到的每个解决方案来获得正确的东西。

提前致谢!

【问题讨论】:

    标签: c# unity3d camera rotation


    【解决方案1】:

    您的场景层次结构是什么样的?您能否让相机成为您想要绕行的物体的子对象,让相机始终注视物体,然后用鼠标旋转物体?

    类似于this 的回答。

    所以是这样的:

    // Move the camera to the correct position/distance from the target.
    Camera.main.transform.position = target.position + new Vector3(0,1,0); // 1m above the target.
    Camera.main.transform.LookAt(target.position);
    Camera.main.transform.SetParent(target);
    
    // Rotate the target with the mouse input.
    Vector3 rotation = new Vector3(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"), 0);
    target.Translate(rotation * Time.deltaTime * 10);
    

    它可能并不完全是您想要的,但它在视觉上看起来像是在绕着物体运行。

    希望有帮助!

    【讨论】:

    • 不幸的是,将相机作为我想要绕行的物体的子对象将意味着大量的返工,所以这不是一个真正的选择。不过,这是我之前研究过的。
    • 您可以使用多个摄像头并在它们之间切换吗?
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2019-03-21
    相关资源
    最近更新 更多