我如何修复二维Quaternion.LookRotation

问题描述 投票:0回答:1

[我试图让玩家在2D自上而下的射击游戏中看着我的鼠标。我还没有使用四元数的经验,但是我设法解决了对象旋转的常见问题。我还有其他问题,播放器完全指向鼠标,它只是指向某个随机方向。

Public Transform playerPos;
Private Vector3 mousePos;

// Define and look at mouse

 void MouseL()
{
    mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1);
    Vector3 relativePos = mousePos - playerPos.position;

// rotate relativePos so the player will not rotate 90 deg in y axis

    Vector3 rotatedRelativePos = Quaternion.Euler(0, 0, 90) * relativePos;
    Quaternion rotation = Quaternion.LookRotation(Vector3.forward, rotatedRelativePos);
    playerPos.rotation = rotation;


}

// Update is called once per frame
void Update()
{

    MouseL();
}

即使relativePos确实发生了变化,玩家的旋转也不会由于某些原因而影响我随玩家移动的位置,似乎只有当mousePos发生改变时它才会旋转,但是我将relativePos置于旋转中,所以我不会知道当rotatedRelativePos确实发生变化时它不会旋转。

编辑:如果relativePos改变,旋转也会改变,但是会非常微小,例如整个屏幕上的2度。

c# unity3d rotation
1个回答
0
投票
  1. 您确定您的角色在XY平面中移动,而不是在XZ中移动,这是统一3D的默认设置?
  2. 您直接将鼠标屏幕位置用作世界位置,只有当您的角色位于屏幕空间中的画布上时,这才有可能-叠加模式(或非常不寻常的手动设置),在其他情况下,您需要将屏幕转换为世界一分钱您最近一次更新的句子指出了这个问题,所以我认为是这种情况。
  3. 对我有什么帮助:

Vector3 worldUp = Vector3.up; //您可以在此处设置世界上轴

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Plane plane = new Plane(worldUp, playerPos.position);
float enter;
if (plane.Raycast(ray, out enter))
{
    // next two lines does the same, so select one at your own:
    //playerPos.LookAt(ray.GetPoint(enter), worldUp);
    playerPos.forward = ray.GetPoint(enter) - playerPos.position;
}

[通常,与四元数相比,使用矢量进行操作更方便,只需设置transform的局部前向方向,该方向等于moustPointerPosition-playerPosition。

© www.soinside.com 2019 - 2024. All rights reserved.