java - 无法根据俯仰和偏航正确计算法线/方向 vector-LMLPHP

我的球场和偏航被弄乱了。
我有垫子的俯仰和偏航,但是光束的俯仰和偏航被弄乱了。
如何计算打击垫的俯仰和偏航的法线向量?我尝试了从计算器溢出的数学运算,但到目前为止它们都失败了。

我首先尝试的是在垫子的螺距上增加90,但偏航却一团糟:
java - 无法根据俯仰和偏航正确计算法线/方向 vector-LMLPHP

这就是当我习惯于按一下垫板的俯仰和偏航来计算方向矢量时会发生的情况:
java - 无法根据俯仰和偏航正确计算法线/方向 vector-LMLPHP

我接下来尝试做的是从垫子的俯仰和偏航中分离出梁的俯仰和偏航,并分别计算它们。多数情况下是有效的,但是偏航仍然完全被搞砸了。

我用来根据光束的偏航和俯仰来计算方向矢量的是一个我的世界飞机用来为小怪做的:

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);

这对于偏航非常有效,但对于俯仰没有成功
java - 无法根据俯仰和偏航正确计算法线/方向 vector-LMLPHP

俯仰和偏航均以玩家头部旋转的方式计算。
当我在垫板本身上使用垫板时,垫板的俯仰和偏航是100%正确的,但在梁上使用它们时会弄乱。这些都使用GL功能

尽管俯仰和偏航不尊重玩家头部的定向系统,但它可以与打击垫一起使用。

例如,这是此图中镜子的偏航,非常适合当前值
java - 无法根据俯仰和偏航正确计算法线/方向 vector-LMLPHP
垫旋转如下:
    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);

如何从垫的俯仰和偏航正确计算法向矢量或垂直于垫的矢量?

我现在不知所措,因为我几乎在Google上所做的几乎所有尝试都没有运气。

编辑:有人告诉我,不必将光垫的俯仰角和偏航角从垫子的俯仰角和偏航角上分开,我同意,但我无法使它正常工作。为何光束绘制数学与打击垫数学不同?

最佳答案

我不确定这是否是您的问题,但对我来说,当我与他们打交道时,mc返回了一些混乱的偏航位置,这就是我如何解决的问题

    if (Yaw < -180.0) Yaw += 360;
    else if (Yaw > 180) Yaw -= 360;

08-16 03:12