当前位置: 首页 > 知识库问答 >
问题:

无法根据俯仰和偏航正确计算法线/方向矢量

邹曦之
2023-03-14

我的投球和打哈欠都搞砸了。我有垫子的俯仰和偏航,但光束的俯仰和偏航都搞砸了。如何计算垫的俯仰和偏航的法向量?我在stackoverflow上尝试了一大堆数学,但到目前为止都失败了。

我接下来尝试做的是将光束的俯仰和偏航从垫子的俯仰和偏航中分离出来,并分别计算它们。这基本上有效,但偏航仍然完全混乱。

我过去是通过光束的偏航和俯仰来计算方向向量的,这是一个util minecraft用来计算暴徒的方向向量:

public static Vec3d getVectorForRotation3d(float pitch, float yaw) {
    float f = MathHelper.cos(-yaw * 0.017453292F - (float) Math.PI);
    float f1 = MathHelper.sin(-yaw * 0.017453292F - (float) Math.PI);
    float f2 = -MathHelper.cos(-pitch * 0.017453292F);
    float f3 = MathHelper.sin(-pitch * 0.017453292F);
    return new Vec3d((double) (f1 * f2), (double) f3, (double) (f * f2));
}

但这显然失败了,所以最后,我尝试了以下使用垫的音高:

    double pitch = ((te.getPadPitch() + 90) * Math.PI) / 180;
    double yaw = ((te.getPadYaw() + 90) * Math.PI) / 180;
    double x = Math.sin(pitch) * Math.cos(yaw);
    double y = Math.sin(pitch) * Math.sin(yaw);
    double z = Math.cos(pitch);
    Vec3d lookvec = new Vec3d(x, y, z);

俯仰和偏航都是按照球员头部旋转的方式计算的。当我在垫子上使用垫子时,垫子的俯仰和偏航是100%正确的,但当我在横梁上使用垫子时,垫子的俯仰和偏航是错误的。它们都使用GL函数

虽然俯仰和偏航不尊重球员头部的方向系统,但它与垫板一起工作。

    GlStateManager.rotate(te.getPadYaw(), 0, 0, 1);
    GlStateManager.rotate(te.getPadPitch(), 1, 0, 0);

这条线是这样画的:

    public static void drawConnection(BlockPos pos1, BlockPos pos2, Color color) {
    GlStateManager.pushMatrix();

    GL11.glLineWidth(1);

    GlStateManager.disableTexture2D();
    GlStateManager.color(color.getRed(), color.getGreen(), color.getBlue(), 0.7f);
    GlStateManager.translate(0.5, 0.7, 0.5);

    VertexBuffer vb = Tessellator.getInstance().getBuffer();
    vb.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION);
    vb.pos(pos2.getX() - pos1.getX(), pos2.getY() - pos1.getY(), pos2.getZ() - pos1.getZ()).endVertex();
    vb.pos(0, 0, 0).endVertex();
    Tessellator.getInstance().draw();

    GlStateManager.enableTexture2D();

    GlStateManager.popMatrix();
}

我得到了pos1和pos2(目前,最近):

        double pitch = ((te.getPadPitch() + 90) * Math.PI) / 180;
    double yaw = ((te.getPadYaw() + 90) * Math.PI) / 180;
    double x = Math.sin(pitch) * Math.cos(yaw);
    double y = Math.sin(pitch) * Math.sin(yaw);
    double z = Math.cos(pitch);
    Vec3d lookvec = new Vec3d(x, y, z);

    Vec3d centervec = new Vec3d(te.getPos().getX() + 0.5, te.getPos().getY() + 0.8, te.getPos().getZ() + 0.5);
    Vec3d startvec = centervec.add(lookvec);

    Vec3d end = startvec.add(new Vec3d(lookvec.xCoord * 30, lookvec.yCoord * 30, lookvec.zCoord * 30));
    RayTraceResult result = te.getWorld().rayTraceBlocks(startvec, end, true, false, true);
    Utils.drawConnection(te.getPos(), result.getBlockPos(), Color.RED);

我如何计算法向量或垂直于刹车片的向量,从刹车片的俯仰和偏航来计算?

我现在不知所措,因为我几乎尝试了在谷歌上找到的所有东西,大部分都没有运气。

编辑:有人告诉我,将光束的俯仰和偏航与垫的俯仰和偏航分开是不必要的,我同意,但我就是不能让它以其他方式工作。为什么光束绘制数学与垫数学不同?

共有2个答案

琴元凯
2023-03-14

Minecraft的偏航旋转有点奇怪。它们不会夹在0到360之间。例如,如果你向右旋转头部很长时间,你最终会旋转超过1000度。当夹在0到360度之间时,1000度变成280度。如果数字是负数,那么你应该从360中减去这个数字。这是一个夹在0到360之间的角度的例子:

public static float clamp(float angle) {
    angle = angle % 360; // Gets the remainder when dividing angle by 360
    if(angle < 0) {
        angle = 360 - angle;
    }
    return angle;
}

如果您使用此设置角度,事情将始终在0到360之间。此外,这是直接来自MCP源代码的片段,其中旋转偏航/俯仰被转换为旋转矢量:

/**
 * Creates a Vec3 using the pitch and yaw of the entities rotation.
 */
protected final Vec3 getVectorForRotation(float pitch, float yaw)
{
    float f = MathHelper.cos(-yaw * 0.017453292F - (float)Math.PI);
    float f1 = MathHelper.sin(-yaw * 0.017453292F - (float)Math.PI);
    float f2 = -MathHelper.cos(-pitch * 0.017453292F);
    float f3 = MathHelper.sin(-pitch * 0.017453292F);
    return new Vec3(f1 * f2, f3, f * f2);
}
宗政和韵
2023-03-14

我不确定这是否是你的问题,但对我来说,当我处理它们时,mc返回了一些混乱的偏航位置,这就是我如何修复的

    if (Yaw < -180.0) Yaw += 360;
    else if (Yaw > 180) Yaw -= 360;
 类似资料:
  • 如果我有一个相机的偏航、俯仰和向上向量(在我的情况下总是[0,1,0]),计算相应滚动的最佳方法是什么?

  • 我想做的是从我的相机中投射光线。我知道相机的x、y和z坐标,以及它的俯仰和偏航。我需要计算它的方向向量,这样我就可以把它传递给光线跟踪算法。 相机的向上向量是(0,1,0)。“音高”,从相机的角度来看,是上下看。 (我宁愿不使用矩阵,但如果有必要,我会使用)

  • 我试图从我有的方向向量(从中我可以得到俯仰和偏航)和滚动来计算一个向上向量。我需要这个,这样我就可以做一个四元数。 有人知道我怎么做吗?

  • 我一直在处理3D空间(X、Y、Z)中的点,希望能够计算其中两个点之间的俯仰和偏航。 我的当前代码: 其中X1、X2、Y1、Y2、Z1、Z2在运行时之前都是未知的,此时它们是从两个随机生成的点收集的。 然而,由于某种原因,我的结果大错特错,我尝试了许多不同的组合,在google上搜索了无数的东西,但什么都没有找到。 一些制约因素是: 节距只能小于或等于90,或大于或等于-90(90= 这是我第一次使

  • 所以基本上在我的游戏中,我设法添加了向右移动,然后应用了相反的逻辑向左移动,但我仍然没有设法向前或向后移动。我只有一个俯仰和偏航可以使用,这意味着我没有RotationX、Y或Z。如果你能帮我计算这些,如果有必要的话也会很酷。这是我目前的代码: 我也有一个创建视图矩阵方法,称为每一帧,就像camera.update()方法一样

  • 我有一个问题,我不知道如何使用Java/LWJGL在OpenGL中渲染方向向量。 我有以下系统: X位于屏幕右侧 因此我走在XZ平面上,现在我想实现/已经实现了WASD运动,它应该与我当前前进的方向有关。(W=向前到相机看方向,S=向后等) 我有一个偏航角,定义如下: 如果一直向前,则为0度 现在我只想要一个代表偏航方向的3D矢量,我该怎么做呢? 我正在使用以下Java代码,包括答案,但似乎还有另