2016-06-07 42 views
5

enter image description here无法正确地计算从基音正常/方向矢量和偏航

我的音高和雅司病被弄乱了。 我有垫的俯仰和偏航,但梁的俯仰和偏航都搞砸了。 我如何计算垫的俯仰和偏航的法向量?我尝试了一堆数学算法,但是它们都失败了。

我第一次尝试是添加90〜垫的间距,但偏航留了下来搞砸: enter image description here

这是我用来垫的俯仰和偏航的是计算的方向会发生什么矢量: enter image description here

我接下来尝试做的事情是将梁的间距和偏航距离垫的间距和偏航分开,并分别计算它们。这大部分工作,但偏航仍然完全搞砸了。

我用来从偏航和梁的间距计算的方向矢量是一个实用程序的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); 

这工作完全偏航,但未能为间距 enter image description here

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

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

例如,这是在该PIC反射镜的横摆和它非常适合它的当前值 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); 

我如何计算法线矢量或垂直于垫片的矢量,从垫片的俯仰和偏航中恰当地进行计算?

我在这一点上很茫然,因为我尝试了几乎所有在谷歌上找到的东西,但大部分都没有运气。

编辑:我被告知,分离梁的音高和偏离垫的音高和偏航不应该是必要的,我同意,但我不能让它工作,否则。为什么梁的绘制数学与垫数学不同?

+1

单个提示可能会帮助您或不会:Minecraft的偏航角度与您所期望的不符。看看[wiki.vg文章中的一些信息和图表](http://wiki.vg/Protocol#Player_Look)。 (这可以解释为什么通过偏转旋转键盘给出了不正确的结果 - 可能是在与原始的'getVectorForRotation3d'结合使用'yaw-90'的时候) – Pokechu22

+0

我也建议寻找[bukkit如何处理这个] (https://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/Location.java#L244)。 – hintss

+1

@hintss hey hintss! <3谢谢你。我会试试看。 – demoniaque

回答

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都是合理的,但我认为你的数学有点偏差,或者只是一个语法错误,或者我完全错误(这可能是最可能的)。