首页 文章

向transform.forward移动,忽略旋转

提问于
浏览
1

此代码附加到相机:

transform.position += Input.GetAxis("Vertical") * transform.forward * mod;
transform.position += Input.GetAxis("Horizontal") * transform.right * mod;

我使用了.forward和.right,因为玩家能够在Y轴上旋转相机,因此无论相机朝向前进键的哪个方向总是相机向前移动,左键会相对移动左等等 . 只是为了澄清 - 我希望它移动到局部空间,而不是世界空间,所以前进是它面向的方向,不一定是Vector3(0,0,1) .

相机是免费漫游的,没有父母或目标可供遵循 .

问题是相机的X旋转为45以向下看 . 因此,使用transform.forward将修改它的高度 . 还有一些滚动代码可以更改摄像机高度,因此我不想将高度设置为固定值 . 我怎样才能限制移动到X和Z,最好不要将它变成空的?

更新:这段代码有效,但它并不漂亮,我确信使用Vector3.Project有一个更优雅的解决方案,正如xyLe_所暗示的那样 . 如果我搞清楚,我会补充他的答案 .

mod = Time.deltaTime * 30;
float yPos = transform.position.y;
pos = transform.position;
pos += Input.GetAxis("Vertical") * transform.forward * mod;
pos.y = yPos;
pos += Input.GetAxis("Horizontal") * transform.right * mod;
pos += Input.GetAxis("Mouse ScrollWheel") * transform.up * mod * -30;

2 回答

  • 3

    我现在可能会胡说八道,但对我来说似乎很简单:

    Vector3 desiredDirection = Vector3.Normalize(new Vector3(transform.forward.x, transform.position.y, transform.forward.z))

    只需将 transform.forward 投影到x-z平面上,该平面的高度为 transform.position.y . 这样做(通常)导致向量略短,因此您必须重新规范化它 .

    想象:

    vec img

    如果我理解正确, transform.forward 对应黑色矢量,你想要绿色矢量 . 通过将黑色矢量的y分量设置为红点位置y分量的y分量,可以得到紫色矢量,该矢量必须重新规范化 .

  • 0

    即使这已经解决了,下面的解决方案应该可以帮助其他人解决这个问题 .

    这是在忽略旋转的同时向 transform.forward 移动的正确方法:

    1 . 获取 transform.forward .

    2 . 使用 InverseTransformDirection 将其转换为本地空间

    3 . 将 y 轴设置为 0 ;

    4 . 使用 dir.Normalize() 标准化;

    5 . 将新pos贴到 transform.position .

    public float mod = 2;
    
    void Update()
    {
        //Get Forward face
        Vector3 dir = transform.forward;
        //Convert to local Space
        dir = transform.InverseTransformDirection(dir);
        //Reset/Ignore y axis
        dir.y = 0;
        dir.Normalize();
    
        //Append the new pos to the `transform.position`.
        transform.position += dir * Input.GetAxis("Vertical") * mod;
        transform.position += Input.GetAxis("Horizontal") * transform.right * mod;
    }
    

    Another Method(Not Recommended):

    由于相机倾斜角度为45度:

    1 . 将其旋转至 -45

    2 . 正常移动相机

    3 . 将其重新转回 45

    public float startingOffset = 45;
    public float mod = 2;
    
    
    // Update is called once per frame
    void Update()
    {
        //Rotate it to -45
        transform.Rotate(new Vector3(-startingOffset, 0, 0));
    
        // Move the camera normally
        transform.position += Input.GetAxis("Vertical") * transform.forward * mod;
        transform.position += Input.GetAxis("Horizontal") * transform.right * mod;
    
        //Rotate it back to 45
        transform.Rotate(new Vector3(startingOffset, 0, 0));
    }
    

    这两个都应该有效,但首选方式应该是第一个 .

相关问题