2016-06-07 9 views
5

enter image description hereठीक से पिच से एक सामान्य/दिशा वेक्टर की गणना करने और रास्ते से हटना

मेरे पिचों और याज अव्यवस्थित हैं करने में असमर्थ। मेरे पास पैड की पिच और यॉ है लेकिन बीम की पिच और यॉ गड़बड़ हो गई है। मैं पैड की पिच और यॉ के लिए सामान्य वेक्टर की गणना कैसे करूं? मैंने स्टैक ओवरफ्लो के गणित के बकवास भार की कोशिश की लेकिन वे सभी अब तक विफल रहे।

क्या मैं पहली बार पैड की पिच करने के लिए 90 को जोड़ने था की कोशिश की लेकिन विचलन में गड़बड़ रुके: enter image description here

और यह क्या होता है जब मैं पैड के अक्षनमन और पार्श्ववर्तन के लिए इस्तेमाल किया के रूप में दिशा की गणना करने के लिए है वेक्टर: enter image description here

मैंने जो करने की कोशिश की वह बीम की पिच और यॉ को पैड की पिच और यॉ से विभाजित कर दिया गया और दोनों अलग-अलग गणना की गई। वह ज्यादातर काम करता था लेकिन जबड़ा पूरी तरह से गड़बड़ हो गया था।

क्या मैं विचलन और बीम की पिच से दिशा वेक्टर गणना के लिए इस्तेमाल एक 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); 

और यह विचलन के लिए पूरी तरह से काम किया है, लेकिन पिच enter image description here

के लिए असफल पिच और यो दोनों खिलाड़ी के सिर घुमाने के तरीके में गणना की जाती हैं। जब मैं उन्हें पैड पर उपयोग करता हूं तो पैड की पिच और यॉ 100% सही होती है लेकिन बीम पर उनका उपयोग करते समय गड़बड़ होती है। ये दोनों जीएल फ़ंक्शंस

दोनों का उपयोग कर रहे हैं हालांकि पिच और यो खिलाड़ी के सिर की ओरिएंटेशन सिस्टम का सम्मान नहीं करते हैं, यह पैड के साथ काम करता है।

उदाहरण के लिए, यह इस तस्वीर में दर्पण के विचलन है और यह एकदम सही है के लिए यह वर्तमान मूल्य 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); 

मैं सामान्य वेक्टर या वेक्टर की गणना कैसे करूं जो पैड के पिच और यॉ से पैड के लंबवत है?

मुझे इस बिंदु पर एक नुकसान हुआ है क्योंकि मैंने भाग्य के साथ अधिकांश भाग के लिए Google पर जो कुछ भी पाया है, मैंने कोशिश की है।

संपादित करें: मुझे बताया गया है कि पैड की पिच और यॉ से बीम पिच और यॉ को विभाजित करना जरूरी नहीं है, और मैं सहमत हूं लेकिन मैं इसे अन्यथा काम करने के लिए नहीं मिल सकता। पैड गणित से बीम ड्राइंग गणित अलग क्यों है?

+1

एक भी युक्ति जो आपकी मदद कर सकती है या नहीं: Minecraft के yaw कोण आप जो अपेक्षा करेंगे उससे मेल नहीं खाता है। [कुछ जानकारी और आरेखों के लिए wiki.vg आलेख] देखें (http://wiki.vg/Protocol#Player_Look)। (यह बताएगा कि पैड को घुमाकर क्यों गलत परिणाम देता है - यह हो सकता है कि मूल 'getVectorForRotation3d') के साथ संयुक्त होने पर 'yaw-90' काम करता है) – Pokechu22

+0

मैं यह भी सुझाव देना चाहता हूं कि यह कैसे है [यह कैसे काम करता है] (https://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/Location.java#L244)। – hintss

+1

@ हिंट्स हे संकेत! <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) का उपयोग क्यों किया? यह y और z दोनों के लिए समझ में आता है, लेकिन मुझे लगता है कि आपका गणित थोड़ा सा है, या सिर्फ एक वाक्यविन्यास त्रुटि है, या मैं पूरी तरह गलत हूं (शायद सबसे अधिक संभावना है)।

संबंधित मुद्दे