2010-04-30 21 views
5

में जावास्क्रिप्ट phsyics तो, मैं खुद को कैनवास (एचटीएमएल 5) पढ़ाने पर काम कर रहा हूं और इसमें से एक सरल गेम इंजन कोड किया गया है। यह अंतरिक्ष दृश्य (ग्रह, सितारों, दिव्य निकायों, आदि) का 2 डी प्रतिनिधित्व है। मेरी डिफ़ॉल्ट "स्प्राइट" श्रेणी में फ्रेम फ्रेमर है:2 डी स्पेस

"बेस क्लास" में एक ऐसा फ़ंक्शन होता है जो विरासत की अनुमति देता है और "ए" को "ए" पर लागू करता है। तो, "var aTest = new sprite ({foo: 'bar'});" "aTest.foo = 'bar'" बना देगा। इस तरह मैं अपनी वस्तुओं को एक दूसरे के सामने उजागर करता हूं।

Sprite = baseClass.extend({ 
    init: function(a){ 
    baseClass.init(this, a); 
    this.fields = new Array(); // list of fields of gravity one is in. Not sure if this is a good idea. 
    this.addFL(function(tick){ // this will change to be independent of framerate soon. 

     // gobjs is an array of all the Sprite objects in the "world". 
     for(i = 0; i < gobjs.length; i++){ 

     // Make sure its got setup correctly, make sure it -wants- gravity, and make sure it's not -this- sprite. 
     if(typeof(gobjs[i].a) != undefined && !gobjs[i].a.ignoreGravity && gobjs[i].id != this.id){ 
      // Check if it's within a certain range (obviously, gravity doesn't work this way... But I plan on having a large "space" area, 
      // And I can't very well have all objects accounted for at all times, can I? 
      if(this.distanceTo(gobjs[i]) < this.a.size*10 && gobjs[i].fields.indexOf(this.id) == -1){ 
      gobjs[i].fields.push(this.id); 
      } 
     } 
     } 
     for(i = 0; i < this.fields.length; i++){ 
     distance = this.distanceTo(gobjs[this.fields[i]]); 

     angletosun = this.angleTo(gobjs[this.fields[i]])*(180/Math.PI); // .angleTo works very well, returning the angle in radians, which I convert to degrees here. 

     // I have no idea what should happen here, although through trial and error (and attempting to read Maths papers on gravity (eeeeek!)), this sort of mimics gravity. 
     // angle is its orientation, currently I assign a constant velocity to one of my objects, and leave the other static (it ignores gravity, but still emits it). 
     // This cant be right, because it just _sets_ the angle regardless of whatever it was. 
     // This is where we need to find "the average of the forces". 
     this.a.angle = angletosun+(75+(distance*-1)/5); //todo: omg learn math 

     if(this.distanceTo(gobjs[this.fields[i]]) > gobjs[this.fields[i]].a.size*10){ 
      this.fields.splice(i); // out of range, stop effecting. 
     } 
     } 
    }); 

    //draw objects based on new position (from fixed velocity and angle). 

    } 
}); 

अग्रिम धन्यवाद। असली चाल यह है कि एक पंक्ति, और बीटीडब्ल्यू मुझे पता है कि यह कोई मतलब नहीं है। डिग्री + दूरी = विफलता।

this.a.angle = angletosun+(75+(distance*-1)/5); 

यह जावास्क्रिप्ट की तुलना में अधिक एक भौतिक विज्ञान सवाल है, लेकिन मैं खोज की है और खोज की है और कक्षीय गणित पर कई विकी लेख के लिए रास्ता पढ़ा है। यह मेरे सिर बहुत पर जल्दी हो जाता है।

+2

सवाल क्या है? मैं इसे कोड में जानता हूं। लेकिन आपको इसे कहीं और बता देना चाहिए। –

+0

मेरे पास एक निश्चित गति के साथ एक वस्तु है, जो 0 डिग्री पर इंगित करती है। यह किसी अन्य शरीर के गुरुत्वाकर्षण प्रभाव के तहत है, कहें, बिल्कुल 100 इकाइयां 90 डिग्री पर दूर हैं। मैं कैसे कर सकता हूं) शरीर के प्रति वेक्टर की गणना करें, और बी) अलग-अलग वस्तुओं की दिशा में विभिन्न वैक्टरों की संख्या (या औसत?) पाएं। – user330123

+0

अंत में मैं एक सितारा और एक ग्रह बना सकता था, और बहुत सावधानीपूर्वक चुने हुए वेग और कोण के साथ, एक कामकाजी (चक्रीय) कक्षा बना सकता था। यदि सही तरीके से किया जाता है, तो "गैर-गुरुत्वाकर्षण उत्सर्जक" वस्तुएं बनाना आसान होगा (इस प्रकार, धूमकेतु और छोटे स्पेसशिप), और "गुरुत्वाकर्षण के क्षेत्र" में जोर डालने और गिरने में सक्षम होंगे। – user330123

उत्तर

3

ओह, यह मुझे स्मृति लेन नीचे ले जाता है, भौतिकी सिमुलेशन के साथ खेलना बहुत मजेदार है।

किसी भी मामले में, ऐसा लगता है कि आपको अपने वेक्टर गणित को पॉलिश करने की आवश्यकता है, शायद यह सबसे महत्वपूर्ण बात है, इस आलेख में वेक्टर गणित के बारे में जानने के लिए आवश्यक सब कुछ होना चाहिए, हालांकि मुझे यकीन नहीं है कि यह सबसे आसान उपलब्ध स्रोत है। http://en.wikipedia.org/wiki/Euclidean_vector

आपका कोड थोड़ा अधिक ऑब्जेक्ट-ओरिएंटेड लगता है, निश्चित रूप से यह वरीयता का विषय है, लेकिन मैं शुद्ध डेटा ऑब्जेक्ट्स पर चिपकता हूं और तर्क को अलग-अलग कार्यों में रखता हूं।

और यहां शुरू करने के लिए यहां एक छोटा भौतिकी गणित है, प्रत्येक ऑब्जेक्ट में वेक्टर के रूप में स्थिति होनी चाहिए, एक वेक्टर के रूप में एक वेग, और द्रव्यमान होना चाहिए।

हर टिकटिक के लिए आप दो काम करते हैं, हर वस्तु के लिए आप स्थिति के लिए वेग जोड़ें: हर अन्य वस्तु के संबंध में

p=p+v 

और हर वस्तु के लिए आप गणना की गुरुत्वाकर्षण बल के अनुसार वेग बदल । बी के वेग में अच्छी तरह से इसलिए है क्योंकि एक की के गुरुत्वाकर्षण की तरह बदल जाएगा:

B.v=B.v+(A.p-B.p)*(A.m/(|A.p-B.p|^3)) 

एक बार जब आप वेक्टर गणित फटा है आप वास्तविक कोड में इस का अनुवाद करने में सक्षम होना चाहिए।

+0

मैं वास्तव में जावास्क्रिप्ट में वेक्टर बनाने का तरीका नहीं समझता, हालांकि मुझे लगता है कि कुछ पुस्तकालय हैं। तो एक स्थिति और वेग वेक्टर ... जहां मैट्रिक्स में प्रत्येक मान जाता है? [पॉक्स, पॉजि, गति]? मैंने उस विकी पेज को पढ़ लिया है, और मैं जावास्क्रिप्ट में वेक्टर गणित को देख रहा हूं, लेकिन मेरे पास एक वेक्टर का उपयोग करके वेग का प्रतिनिधित्व करने के तरीके के रूप में कुछ प्रकार का डिस्कनेक्ट है। धन्यवाद एक गुच्छा बीटीडब्ल्यू ... मैं थोड़ी देर के लिए अपनी पोस्ट को डीकोड करने की कोशिश कर रहा हूं, मुझे लगता है: डी – user330123

+0

ठीक है, मुझे लगता है कि अब मैं समझता हूं। एएम क्या है? ए द्रव्यमान? यह एक वेक्टर मात्रा नहीं है? यदि नहीं, तो मैं एक सामान्य संख्या में वेक्टर कैसे जोड़ूं (या वह एक गूंगा सवाल है) – user330123

+0

इसके अलावा, आप वेक्टर डिवीजन कैसे करते हैं? – user330123