【问题标题】:Rotating field of view with player与播放器一起旋转视野
【发布时间】:2019-05-15 03:07:54
【问题描述】:

所以我试图创建一个系统来寻找可以攀爬的壁架。我有一个垂直视野来寻找这些壁架,到目前为止,我已经让它随着模拟摇杆的方向旋转,所以我可以找到一个壁架并移动到我的模拟指向的地方。 (向上看,找到窗台,向上移动等)。我的问题是,当视野移动到我需要它移动的地方时,它保持固定在一个轴上并且不随玩家旋转。

在图片中,圆锥体朝向它应该在的位置,并按照我的意愿围绕玩家旋转,但正如您所见,圆锥体面向 X 轴并且不会从那里移动。我希望它与播放器一起旋转。

在下面的代码中,返回的 Vector 的 y 值使圆锥指向上方。我在 x 和 z 值中尝试了各种函数,但没有任何问题。

public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
{
    if(!angleIsGlobal)
    {
        angleInDegrees += (viewDir + 90);
    }

    Vector3 newValue = new Vector3(0, Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
    return newValue;
}

viewDir 值使锥体随着我的模拟摇杆旋转,为了使锥体随着我的播放器旋转,我认为需要使用 x 或 z 值或两者来完成某些事情,但对于我的生命来说,我想不通。 感谢您在此问题上提供的任何帮助。如果我的解释不是很好,请道歉。

void OnSceneGUI()
    {
        LedgePointSearch lps = (LedgePointSearch)target;
        Handles.color = Color.white;
        Handles.DrawWireArc(lps.transform.position, lps.transform.forward * 90, Vector3.up, 360, lps.viewRadius);
        Vector3 viewAngleA = lps.DirFromAngle(-lps.viewAngle / 2, false);
        Vector3 viewAngleB = lps.DirFromAngle(lps.viewAngle / 2, false);

        Handles.DrawLine(lps.transform.position, lps.transform.position + viewAngleA * lps.viewRadius);
        Handles.DrawLine(lps.transform.position, lps.transform.position + viewAngleB * lps.viewRadius);
    }

这是显示视野的编辑器脚本。

圆圈仅代表视野的半径,即向外的距离。

https://www.dropbox.com/s/k9siha2aog9vj8o/fov.mp4?dl=0

在视频中,圆圈随着播放器旋转,圆锥随着我的左侧模拟动作旋转。我希望圆锥体像圆一样,它像我的播放器一样旋转,但仍与我的模拟动作相匹配。

【问题讨论】:

  • 抱歉,我无法从你的图片中看出你在说哪个锥体? angleInDegrees 是什么意思 - 是你想让圆锥指向的角度吗?大概您希望圆锥围绕X 轴旋转,并且您的角度是在该方向上测量的。当您说“圆锥面向 X 轴”时,我也很困惑?这种事情很难用语言来解释,即使是手绘图也会有所帮助。
  • 图片中的圆锥是玩家头顶上方的圆锥,在圆圈内。是的,angleInDegrees 是控制锥体指向的角度。当我的球员旋转时,围绕我的球员的白色圆圈的边缘保持在他的两侧,我希望圆锥体也一样
  • dropbox.com/s/z9ybypxencl35os/p1.PNG?dl=0 dropbox.com/s/wr1ktnfz8cueywq/p2.PNG?dl=0 这两张图片展示了圆是如何随着玩家旋转的,而圆锥却没有
  • 目前还不清楚返回值的含义是什么。请编辑您的帖子并包含使用来自DirFromAngle 的返回值来旋转/渲染圆圈和视野的代码。
  • 抱歉,我无法理解这个问题 - 圆圈是干什么用的?有问题的“圆锥”是 Unity 绘制的指向 y 轴的绿色圆锥吗?或者你的意思是形成圆段的两条线?您应该使用绘画工具来绘制您想要发生的事情。

标签: c# unity3d trigonometry fieldofview


【解决方案1】:

解决此问题的一种方法是找到播放器的 Y 旋转并将其应用于newValue,然后再返回。

public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
{
    if(!angleIsGlobal)
    {
        angleInDegrees += (viewDir + 90);
    }

    Vector3 newValue = new Vector3(0, Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));

    // get Y rotation of player
    yRotationAngle = player.transform.rotation.eulerAngles.y;

    // convert to Quaternion using only the Y rotation
    Quaternion yRotation = Quaternion.Euler(0f, yRotationAngle + 90f, 0f);

    // Apply yRotation
    newValue = yRotation * newValue;

    return newValue;
}    

【讨论】:

  • 不幸的是,它没有用。它只是延长了圆锥线。但是,我认为你在正确的轨道上。我需要对我的玩家的旋转做一些事情,以便圆锥知道在哪里旋转。感谢您的尝试。
  • @MatthewMcginley 我的代码不会/不应该改变newValue 的长度。您可以编辑您的帖子并包含您尝试过的内容吗?我觉得可能有错别字。确保将 newValue 乘以从调用 Quaternion.Euler 获得的 Quaternion
  • 对不起,我弄错了。你是救生员。我已经坚持了三天。我真的很感谢你的帮助。一切都按应有的方式旋转。非常感谢
  • dropbox.com/s/5jxmkw480oroukv/yay.mp4?dl=0 必须稍微改变一下才能面对正确的方向。 c# Quaternion yRotation = Quaternion.Euler(0f, yRotationAngle + 90, 0f); 总的来说,一切都很好。再次感谢。
  • @MatthewMcginley 谢谢!我会在我的回答中包括这一点。很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多