无法从俯仰和偏航中正确计算法线/方向向量

时间:2016-06-07 08:39:23

标签: java vector minecraft

enter image description here

我的球场和偏航都搞砸了。 我有垫子的俯仰和偏航,但是梁的俯仰和偏航都搞砸了。 如何计算垫的俯仰和偏航的法向量?我试着从stackoverflow中删除数学,但到目前为止它们都失败了。

我首先尝试的是在垫的间距上加90,但偏航仍然混乱: enter image description here

当我习惯于垫的俯仰和偏航以及计算方向向量时会发生这种情况: enter image description here

我接下来尝试做的是将横梁的俯仰和偏航从发动机的俯仰和偏航中分开,并将它们分别计算出来。这种情况大部分都有效,但偏航仍然完全搞砸了。

我用来计算偏航和横梁俯仰的方向向量是我的工具用来为暴徒做的:

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

这对于偏航来说非常有效,但是球场失败了 enter image description here

俯仰和偏航都是以玩家头部旋转的方式计算的。 当我在垫子上使用垫子时,垫子的俯仰和偏转是100%正确的,但是当我在梁上使用它们时会陷入困境。这些都使用GL函数

虽然俯仰和偏航并不尊重玩家的头部定位系统,但它适用于打击垫。

例如,这是这张照片中镜子的偏航,它对于它的当前价值是完美的 enter image description here 并且垫子像这样旋转:

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

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

我现在感到很茫然,因为我几乎尝试了谷歌上发现的所有内容,但没有运气。

编辑:我被告知,不应该从发射台的俯仰和偏航中分离光束俯仰和偏航是不必要的,我同意但是我无法得到它否则。为什么光束绘制数学与pad数学不同?

2 个答案:

答案 0 :(得分:0)

我很难在评论中这么说,所以我把它放在一个答案中。 当我看到:

double pitch = ((te.getPadPitch() + 90) * Math.PI) / 180;
double yaw = ((te.getPadYaw() + 90) * Math.PI) / 180;
double x = Math.sin(pitch) * Math.cos(yaw); \\Line 3 is HERE <---
double y = Math.sin(pitch) * Math.sin(yaw);
double z = Math.cos(pitch);
Vec3d lookvec = new Vec3d(x, y, z);

为什么使用sin(pitch)cos(yaw)cos()计算您的x,那么为什么使用sin(pitch)?这对yz都有意义,但我认为你的数学有点偏差,或者只是语法错误,或者我完全错了(这可能是最有可能的)。< / p>

答案 1 :(得分:0)

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

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