【问题标题】:How to fix this 90 or -90 rotation problem如何解决这个 90 或 -90 旋转问题
【发布时间】:2019-08-25 02:18:02
【问题描述】:

我编写了这段代码,用于在我们的角色前面创建一个平面,然后我们会使用它 检查敌人的位置并知道他们是否在飞机内。

代码是 Java 并且在我们的服务器上运行,我们在使用 Unity 的游戏中使用它。

在下面的代码中,AreaWidth 是我们要检查的平面的宽度,Area length 是它的长度。 Message 包含有关我们玩家的数据,例如位置和四元数。 bwNode 保存着我们正在检查的当前目标的数据。

float AreaWidth = message.getWidth();
float AreaLength = message.getLength();

double Fi, cs, sn;

Fi = message.quaternion.toEulerAngles().getY();
cs = Math.cos(Fi);
sn = Math.sin(Fi);


int ptx, pty;
ptx = (int)(bwNode.getLoc().getX() - message.loc.getX());
pty = (int)(bwNode.getLoc().getZ() - message.loc.getZ());

double perplen, alonglen;
perplen = Math.abs(ptx * sn - pty * cs);
alonglen = ptx * cs + pty * sn;

if (perplen <= AreaWidth / 2)
{
    if (alonglen >= 0 && alonglen <= AreaLength)
    {
        //the target is inside the area
    }
}

因此,当在游戏中调试或实际使用此代码时,它仅适用于 1 个问题,飞机始终面向玩家的右侧或左侧,而不是始终面向前方/玩家面向的方向。

这是在我们的玩家 Y 旋转上以 0、90、180 和 270 度表示它的图像。 (在这张图片中,白色立方体是玩家,三角形表示玩家面对的位置,球体是敌人,红色透明框表示我们的飞机应该在哪里,彩色线条形成实际创建的飞机。)

我需要帮助找出是什么导致了我的代码。

【问题讨论】:

    标签: java c# unity3d


    【解决方案1】:

    据我了解,这不是关于 Unity 的问题,因为它仅与您的后端有关。

    不管怎样,你真的混淆了目标位置和玩家位置的术语,注意在你的屏幕上,无论玩家看哪里,飞机总是面向目标。

    我的做法是在玩家的坐标系中表达目标,如下所示:

    float AreaWidth = message.getWidth();
    float AreaLength = message.getLength();
    
    Fi = message.quaternion.toEulerAngles().getY();
    cs = Math.cos(Fi);
    sn = Math.sin(Fi);
    
    // First, move the target from word axis origin to player axis origin
    float tx = (bwNode.getLoc().getX() - message.loc.getX());
    float tz = (bwNode.getLoc().getZ() - message.loc.getZ());
    
    // Now rotate the target around it new word origin to apply player rotation
    float ptx = cs * tx - sn * tz;
    float ptz = sn * tx + cs * tz;
    
    // Now ptx and ptz are in new word coordinates, simply test them agains area
    if (-AreaWidth / 2 <= ptx && ptx <= AreaWidth / 2 && AreaLength => 0 && AreaLength <= l) {
        // It is inside
    } else {
        // It is outside
    }
    

    P.S:将玩家完整的变换矩阵传递给服务器可能更容易(而且肯定更有效),而不是分别处理变换和旋转组件。

    【讨论】:

    • 首先感谢您的回答!我刚刚对其进行了测试,现在它确实可以在播放器面前运行,但新问题正在发生。这是一个显示它的视频:youtube.com/watch?v=lim8JAtQtTw&feature=youtu.be 我认为我们计算 ptx 和 ptz 的方式有问题。如您所见,球体(敌人)仅在玩家右侧被视为内部,当目标 X 位置大于宽度/2 时,正确地被视为外部。
    • 但是在播放器的左侧它总是被认为是在外面。我调试了哪个条件不满足,正好是第二个,检查ptz。出于某种原因 ptx 和 ptz 与您在视频中看到的相同,这会导致左侧问题。此外,无论目标距离玩家多远,如果在左侧,它都将被视为在内部,它不会检查实际长度。在这个测试中,宽度为 6,长度为 15。
    • 这里是 Unity 中使用的代码,以便我可以直观地调试。请注意,我修改了您对 ptz 和 length 的原始检查,因为我们要确保我们在长度范围内而不是进一步。 pastebin.com/BNsVAkqJ
    • 哦,我傻了,我把 ptz 公式弄乱了,应该是 ptz = sn * tx + cs * tz 而不是 ptz = sn * tz + cs * tx,现在应该没问题了。
    • 尤里非常感谢。你在这里真的帮助了我。它现在完美运行。如果有什么方法可以奖励您,请发送电子邮件至 Bringitongame@gmail.com 给我
    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 2018-03-21
    • 1970-01-01
    • 2010-11-21
    • 2012-12-23
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多