शनिवार, 12 सितंबर, 2009

XNA: JigLibX की बुनियादी भौतिकी

podstawy-jiglibx खुद XNA, वर्गों की पेशकश करने के लिए हमें भौतिक विज्ञान की गणना में मदद करता है. हालांकि यह एक ही टक्कर का पता लगाने संभव है, लेकिन है कि कैसे वस्तु को आचरण जब यह पता चला है, केवल हमारे द्वारा लिखे कोड पर निर्भर करता है. जब तक हम कर्मचारियों के लिए तैयार किया पुस्तकालयों का उपयोग करें. मैं सबसे लोकप्रिय वॉलपेपर XNA'ową OpenSource पुस्तकालय JigLibX लिया .

आप क्या हासिल कर सकते हैं?

लेखकों, दो उदाहरण के लिए फिल्मों का जिक्र करते हुए:

और एक ही लेखकों JigLibX द्वारा बनाई गई उदाहरण है ...


पर अधिक वीडियो परियोजना स्थल .

एक परियोजना का निर्माण

पहली बात तुम करना चाहिए डाउनलोड करने के लिए डाउनलोड अनुभाग, नवीनतम स्रोत JigLibX'a के. Unpacking के बाद, हम (मेरे मामले में XNA 3.1 परियोजना में) एक नई परियोजना बनाने के लिए, हमारे परियोजना (समाधान NazwaNaszegoProjektu) की मुख्य जड़ पर समाधान एक्सप्लोरर पर क्लिक करें, राइट - क्लिक करें और जोड़ें> मौजूदा परियोजना का चयन करें

jiglibx-dodawanie-projektu1

मौजूदा मौजूदा परियोजना जोड़ने

JigLibX> JigLibX.csproj तो फ़ोल्डर का चयन करें जहां आप पहले एक भौतिकी इंजन डाउनलोड unpacked किया.

jiglibx-dodawanie-projektu

मौजूदा मौजूदा परियोजना जोड़ने

अगर तुम्हें चुना है जब परियोजना, XNA के संस्करण 3.1 के लिए परियोजना का निर्माण, आप अब परियोजना JigLibX संस्करण 3.1 से उन्नयन करना चाहिए है. हम परियोजना जड़ JigLibX> अपग्रेड समाधान पर सही क्लिक करके ऐसा करते हैं. हम यह करने के बाद परियोजना मुख्य परियोजना संदर्भ JigLibX'a के जोड़ने के लिए सक्षम हो. अन्यथा, यह संभव नहीं है क्योंकि वर्तमान में यह 3.0 संस्करण के लिए करना है. संस्करण 3.1 में परिवर्तन काफी बड़े नहीं हैं, तथापि, पूरी तरह से सही करने के लिए पुस्तकालय XNA के इस संस्करण के अंतर्गत संचालित है.

तो, सही हमारे मुख्य परियोजना के रूट (मेरे मामले में यह FizykaZJigLibX कहा जाता है) जोड़ें> संदर्भ> प्रोजेक्ट्स JigLibX> पर क्लिक करें. हमारे परियोजना के पेड़ में, फ़ोल्डर संदर्भ JigLibX प्रकट करना चाहिए. अब हम उस नाम स्थान के लिए उपयोग किया है.

प्रणाली के भौतिक विज्ञान के अलावा

सबसे पहले, यह अपने Game1.cs में उचित नामस्थान जोड़ने के लिए आवश्यक हो जाएगा.

  JigLibX.Physics का उपयोग;
 JigLibX.Geometry का उपयोग;
 JigLibX.Collision का उपयोग; 

इसलिए हम JigLibX'a के रचनाकारों द्वारा लिखे वर्गों का उपयोग कर सकते हैं. शुरुआत के लिए, हमारे वर्ग के निर्माता में, हम दो वस्तुओं बनाएँ.

  सार्वजनिक (Game1)
 {
 ग्राफिक्स = नई GraphicsDeviceManager (यह);
 Content.RootDirectory = "सामग्री";

 PhysicsSystem PhysicsSystem दुनिया = (नया);
 CollisionSystemSAP world.CollisionSystem = (नया);
 } 

वस्तु दुनिया, जो PhysicSystem उदाहरण, सभी आवश्यक चर आरंभ और नियंत्रक हमारे आवेदन के अंदर हो रही घटनाओं के अर्थ होगा. भौतिकी के लिए संबंधित घटनाओं. अगली पंक्ति में, गुण CollisionSystem के लिए, हम एक CollisionSystemSAP बनाई गई वस्तु है, जो किसी भी collisions से पता लगाने के लिए आवश्यक है असाइन. इस वर्ग के टक्कर का पता लगाने, जो इस उदाहरण में, पर्याप्त हो जाएगा के लिए एक एल्गोरिथ्म "झाडू और छँटाई" का उपयोग करता है, लेकिन अगर परियोजना JigLibX टकराव में फ़ोल्डर के लिए देख, हम देखते हैं कि हम करने के लिए अन्य के लिए तैयार कक्षाओं का लाभ लेने में सक्षम हैं, अलग एल्गोरिदम का उपयोग करते हुए, जैसे आधारित ग्रिड (ग्रिड). यदि आप इस चरण को छोड़ देते हैं कि हम collisions से कोई प्रतिक्रिया नहीं, और सुविधाओं बस किसी भी प्रतिक्रिया के बिना उनके द्वारा पारित होगा सकता है.

तुम एक काम करो, अर्थात् चाहिए, हमारे सुविधा है कि भौतिक विज्ञान के तर्क भंडार के लिए नियमित रूप से अद्यतन. ऐसा करने के लिए, बस अद्यतन विधि, निम्न कोड जोड़ें:

  टाइमस्टेप = (नाव) नाव / gameTime.ElapsedGameTime.Ticks के TimeSpan.TicksPerSecond;
 PhysicsSystem.CurrentPhysicsSystem.Integrate (टाइमस्टेप); 

क्योंकि PhysicsSystem.CurrentPhysicsSystem स्थिर का एक घटक है, यह हमारे परियोजना में कहीं से उपलब्ध है, जो निस्संदेह इस समाधान की सुविधा बढ़ जाती है.

एक अभिनेता के वर्ग का निर्माण

अभिनेता वर्ग, यह वास्तव में वस्तु है, जो निर्धारित मापदंडों हमारे आवेदन में वस्तु को परिभाषित है, और जो पर्यावरण के साथ collisions पर किसी भी गणना के लिए आवश्यक हैं बनाने के लिए की सेवा करेंगे.

एक वर्ग BoxActor.cs> जोड़ें> कक्षा हमारे परियोजना के रूट पर क्लिक करके ऐसा बना ..

jiglibx-boxactor-class

एक वर्ग BoxActor.cs के बनाएँ

रखो फ़ाइल BoxActor.cs अंदर निम्नलिखित कोड:

 सिस्टम का उपयोग कर, Microsoft.Xna.Framework का उपयोग कर, Microsoft.Xna.Framework.Graphics का उपयोग, JigLibX.Math का उपयोग, JigLibX.Physics का उपयोग, JigLibX.Geometry का उपयोग, JigLibX.Collision का उपयोग करते हुए, {नामस्थान सार्वजनिक वर्ग FizykaZJigLibX BoxActor: DrawableGameComponent {निजी Vector3 स्थिति, निजी Vector3 पैमाने पर, निजी _body के शारीरिक, शारीरिक शारीरिक सार्वजनिक {{_body पाने के लौटने;}} निजी CollisionSkin _skin, सार्वजनिक CollisionSkin की त्वचा {{वापसी _skin;}} सार्वजनिक BoxActor (खेल खेल, Vector3 स्थिति, Vector3 पैमाने): आधार (खेल), this.scale पैमाने =; this.position = स्थिति}}} 

BoxActor वर्ग वर्ग DrawableGameComponent से विरासत में मिली है क्योंकि अभिनेता स्क्रीन पर तैयार किया जाना चाहिए, ताकि हम देख सकते हैं क्या होता है. ध्रुव की स्थिति बॉक्स के अंदर एक केंद्रीय बिंदु के बारे में जानकारी है, और बड़े पैमाने रखती है उसके आयामों शरीर को एक चर है कि आंदोलन और हमारे वस्तु के रोटेशन के बारे में जानकारी संग्रहीत करता है के रूप में समझा जा रहा है त्वचा पता लगाने के टकराव के लिए जिम्मेदार है.

शारीरिक और CollisionSkin बनाना

अगले कदम BoxActor वर्ग के निर्माता के अंत में जोड़ने जाएगा, निम्न कोड:

  _body = नए (शरीर);
 _skin = नई CollisionSkin (_body);
 _body.CollisionSkin = _skin; 

शरीर के _body चर के लिए एक उदाहरण असाइन करने के लिए, जो राज्य में स्थित है वस्तु के बारे में बुनियादी जानकारी की दुकान होगी _skin हमारी सुविधा के "खोल" है, जो पहले सेट _body के आधार पर बनाया जाएगा के बारे में जानकारी है. अंत में, यह अभी भी सेट कर दिया जाता है CollisionSkin _body के लिए संपत्ति.

अब तय है, क्या आकार, हमारे अभिनेता होगा. यह मंच पर कैसे व्यवहार करेंगे पर निर्भर करता है. Primitives JigLibX> Primitives में पाया वर्ग के लिए देखो.

हमारे मामले में, हम हमारे वस्तु एक बॉक्स की तरह व्यवहार करना चाहते हैं, तो हम वर्ग निर्माता BoxActor के अंत में निम्नलिखित कोड जोड़ने के द्वारा इस वर्ग के बॉक्स का उपयोग करें.

  बॉक्स बॉक्स = नए बॉक्स (Vector3.Zero, Matrix.Identity, पैमाने);
 _skin.AddPrimitive (बॉक्स, नया MaterialProperties (0.8f, 0.8f, 0.7f)); 

हमारे बॉक्स, बॉक्स अभिविन्यास (पहचान मैट्रिक्स कोई रोटेशन, आदि का अर्थ है), और एक पैमाने की केंद्र की स्थिति है कि जब वस्तु BoxActor के निर्माण निर्धारित किया जाएगा: ऊपर में, हम वर्ग बॉक्स की एक नई वस्तु, निर्माता में जिसका मापदंडों के लिए खड़े बनाया.

दूसरी पंक्ति, सतह के साथ टकराने हमारी सुविधा के लिए कहते हैं इतना है कि यह अन्य वस्तुओं के साथ प्रतिक्रिया कर सकते हैं. पहली पैरामीटर एक ऑब्जेक्ट प्रकार जो साथ हम सौदा है, दूसरा पैरामीटर सामग्री (घर्षण और लोच) के व्यवहार निर्दिष्ट करता है.

वस्तु के द्रव्यमान निर्धारण

वस्तु के बड़े पैमाने पर है, जो इसके अलावा में गुरुत्वाकर्षण का केंद्र, बलों है कि इस वस्तु को प्रभावित करेगा की दिशा पर निर्भर करता है अलग अलग होंगे निर्धारित JigLibX लेखकों, निम्न विधि कि वर्ग BoxActor के लिए जोड़ा गया है बनाया.

  SetMass निजी Vector3 (फ्लोट जन)
 {
     PrimitiveProperties primitiveProperties = नई PrimitiveProperties का (
         PrimitiveProperties.MassDistributionEnum.Solid,
         PrimitiveProperties.MassTypeEnum.Mass, मास);

     कबाड़ नाव;
     Vector3 कॉम;
     आईटी मैट्रिक्स;
     मैट्रिक्स itCoM;

     Skin.GetMassProperties (primitiveProperties, कबाड़ बाहर कॉम के बाहर, यह बाहर, itCoM बाहर);

     Body.BodyInertia = itCoM;
     = कबाड़ Body.Mass;

     कॉम वापसी;
 } 

एक ही वर्ग के निर्माता के अंत में, हम के रूप में बड़े पैमाने पर निर्धारित करने के लिए:

  कॉम = SetMass Vector3 (1.0f) के; 

और है कि जब यह हमारे वस्तु के बड़े पैमाने पर लेने के लिए आता है :) . बेशक, कुछ भी नहीं रोकता है कि, आवेदन के दौरान वस्तु के द्रव्यमान को बदल सकते हैं.

सही जगह Box'aw स्थापना

इस चरण में, हम आइटम आप निर्माता में हमारे अभिनेता के निर्माण के दौरान दिया जाएगा पर हमारे बॉक्स सेट. यह हमारी सुविधा के शरीर, के रूप में के रूप में अच्छी तरह से टक्कर के अनुसार एक ही वस्तु की सतह है कि प्रभाव पर्याप्त था और यथार्थवादी फिट करने के लिए आवश्यक है.

BoxActor निर्माता के अंत में, निम्न कोड जोड़ें:

  _body.MoveTo (स्थिति Matrix.Identity);
 _skin.ApplyLocalTransform (नया रूपांतरण (Matrix.Identity, कॉम));
 (_body.EnableBody); 

पहली पंक्ति एक विशेष आइटम पर हमारे अभिनेता के "शरीर" चाल. MoveTo विधि का दूसरा पैरामीटर वस्तु के उन्मुखीकरण को इंगित करता है.

दूसरी पंक्ति टक्कर क्षेत्र क्रमशः संपत्ति के गुरुत्वाकर्षण का केंद्र सेट.

अंतिम पंक्ति, _body अनुकरण सक्षम बनाता है और यह भी एक अभिनेता है. इस लाइन में आवश्यक है क्योंकि अनुकार डिफ़ॉल्ट रूप से अक्षम है.

विश्व की रचना.

चौखटे के लिए संबंधित सभी सेटिंग्स सेट किया गया है, तो आप विश्व बनाने के लिए जा सकते हैं. हमारे परियोजना game1.cs के मुख्य फाइल में निर्माता के अंत में, निम्नलिखित कोड जोड़ें:

  fallingBox = नई BoxActor (यह नई Vector3 (5, 5, 20), नई Vector3 (2, 2, 2));
 immovableBox = नई BoxActor (यह नई Vector3 (0, 0, -5), नई Vector3 (10, 10, 10));
 immovableBox.Body.Immovable = सच;
 Components.Add (fallingBox);
 Components.Add (immovableBox); 

घटक अभी भी वर्ग Game1 में सभी तरीकों पर जोड़ा जा:

  BoxActor fallingBox;
 BoxActor immovableBox; 

पहली दो लाइनें हमारे अभिनेताओं को बनाते हैं. निर्माता में मापदंडों के लिए खड़े: प्रथम उदाहरण है जिसमें अभिनेता बनाया, इस मामले में, हमारे आवेदन मुख्य वर्ग Game1, दूसरी स्थिति, तीसरे पैरामीटर आइटम के आकार है.

तीसरी लाइन का मतलब है कि दूसरी वस्तु स्थिर है, और के रूप में निर्माता को पारित कर दिया मापदंडों में देखा, यह बहुत पहले वस्तु से अधिक (5x) हो जाएगा.

चौथे और पांचवें लाइन हमारे द्वारा बनाई गई वस्तुओं घटकों का एक संग्रह है कि खेल वर्ग है, जो अपने आवेदन के बाद विरासत में मिली द्वारा स्वचालित रूप से तैयार हो जाएगा करने के लिए जोड़ देगा.

ड्राइंग

अब हम अंतिम चरण के लिए बारी है कि, स्क्रीन करने के लिए परिणाम discarding वास्तव में सुंदर शब्दों के लिए, आप दृश्य आकर्षित. लेकिन पहले, हम मॉडल बॉक्स में, जो हम अपने परियोजना में उपयोग जोड़ना होगा. से नमूना मॉडल अभिनव खेल , आप यहाँ डाउनलोड कर सकते हैं .

फ़ाइल unpacking के और निहित फाइलें मॉडल और बनावट के साथ दो समाधान Explorer में होना चाहिए नकल की सामग्री फ़ोल्डर (हमारे परियोजना में) राइट - क्लिक करें और चयन करें> मौजूदा आइटम जोड़ें ... और मॉडल फ़ाइल का चयन करें FBX. दोहराएँ कदम, बनावट से एक फ़ाइल का चयन.

jiglibx-content

फ़ोल्डर सामग्री मॉडल और बनावट के अलावा के बाद

वर्ग BoxActor, एक नया तरीका है कि हमारे मॉडल लोड होगा बनाने के लिए:

  संरक्षित ओवरराइड शून्य (LoadContent)
 {
     मॉडल है = Game.Content.Load ("boxModel);
 } 

और अधिक इस वर्ग के लिए, एक चर मॉडल की घोषणा में सभी तरीकों को जोड़ने:

  निजी मॉडल मॉडल; 

फिर वही वर्ग, निम्न विधि जोड़ें:

  निजी मैट्रिक्स (GetWorldMatrix)
 {
     वापसी
         Matrix.CreateScale (पैमाने) *
         _skin.GetPrimitiveLocal (0) * Transform.Orientation.
         _body.Orientation *
         Matrix.CreateTranslation (_body.Position);
 } 

टक्कर सतह के पैमाने पर है, और वास्तव में कोण जिस पर यह स्थित है, वस्तु के "शरीर" (कोण), और वस्तु का "शरीर" की स्थिति: यह हमारे जटिल दुनिया है, जो हम matrices क्रम में गुणा करके प्राप्त की एक सरणी देता है.

हम अधिक प्रक्षेपण और दृश्य, matrices जो मुख्य आवेदन वर्ग (फ़ाइल game1.cs में) के लिए जोड़ देगा की आवश्यकता होगी:

  निजी मैट्रिक्स _view;
 सार्वजनिक मैट्रिक्स देखें
 {
     मिल
     {
         _view लौटने;
     }
 }

 निजी मैट्रिक्स _projection;
 सार्वजनिक मैट्रिक्स प्रोजेक्शन
 {
     मिल
     {
         _projection वापसी;
     }
 } 

Game1 वर्ग निर्माता में, निम्न पंक्ति जोड़कर प्रक्षेपण मैट्रिक्स के अंत में सेट:

  Matrix.CreatePerspectiveFieldOfView _projection = (
     MathHelper.ToRadians (45.0f)
     (फ्लोट) / (फ्लोट) graphics.PreferredBackBufferHeight का graphics.PreferredBackBufferWidth,
     0.1f,
     1000.0f
 ); 

मैं प्रक्षेपण की मैट्रिक्स के मापदंडों का वर्णन नहीं है, क्योंकि मुझे लगता है कि इस स्तर पर वे काफी स्पष्ट होगा, लेकिन यदि नहीं, मैं तुम्हें करने के लिए आमंत्रित msdn'ie पर इस लेख .

वाम हम दृश्य मैट्रिक्स की स्थापना की है, हम यह विधि अद्यतन करने के लिए, कोड के निम्नलिखित पंक्ति जोड़कर Game1.cs फ़ाइल:

  Matrix.CreateLookAt = _view (
     नई Vector3 (0, 20, 10)
     fallingBox.Body.Position,
     Vector3.Up
 ); 

इस लाइन स्क्रीन के केंद्र के कारण होगा, हमारे गिरने वस्तु हो जाएगा. गिरावट के दौरान, हम देखेंगे कैसे, टक्कर में एक उद्देश्य है कि स्थिर किया गया है के साथ आते हैं.

अंत में, यह रहता है के लिए हमें BoxActor ड्रा, जो स्वत: के लिए इस वस्तु आकर्षित करने के लिए कहा जाता है के लिए एक विधि जोड़ने के लिए.

  सार्वजनिक ओवरराइड शून्य के ड्रा (GameTime gameTime हैं)
 {
     BasicWorldGame खेल = गेम (BasicWorldGame);

     मैट्रिक्स [] रूपांतरण = नए मैट्रिक्स [model.Bones.Count];
     model.CopyAbsoluteBoneTransformsTo (बदल);

     WorldMatrix = GetWorldMatrix (मैट्रिक्स);

     foreach (ModelMesh जाल में model.Meshes)
     {
         foreach (BasicEffect प्रभाव में mesh.Effects)
         {
             (effect.EnableDefaultLighting);
             effect.PreferPerPixelLighting = सच;
             effect.World = रूपांतरण [mesh.ParentBone.Index] * worldMatrix;
             effect.View = game.View;
             effect.Projection = game.Projection;
         }
         (mesh.Draw);
     }
 } 

पहली पंक्ति के साथ, आप देख सकते हैं और प्रक्षेपण matrices के उपयोग है, हमारे आवेदन का मुख्य विषय के लिए एक संदर्भ बनाने हूँ. कोड के बाकी हिस्सों, BasicEffect वर्ग के साथ वस्तुओं प्रतिपादन के लिए विशिष्ट है. केवल महत्वपूर्ण बात करने के लिए दुनिया मैट्रिक्स, मैट्रिक्स है जो वास्तविक समय में गणना की है, और वास्तव में JigLibX हमारे लिए गणना का उपयोग करने के लिए है.

पाया प्रलेखन पर आधारित लेख यहाँ है , लेकिन संकेत मिले हैं कि यहाँ से reproduced पाठ अप्रचलित है, और मुझे संस्करण द्वारा लिखित बेहतर काम करना चाहिए. शायद यह अधूरा 3.1 XNA के साथ संगतता के कारण है, लेकिन से मैं क्या तरीकों को देखा, उनमें से एक तीन से दो मापदंडों के लिए कम हो गया है. JigLibX 0.3.1 संस्करण (11 सितंबर, 2009 के रूप में).

समाप्त करने के लिए डाउनलोड परियोजना (XNA 3.1) (2.1 MB)

संकलित डेमो (XNA 3.1) (0.3 एमबी)


संबंधित प्रविष्टियों

चैनल: शुद्ध / ग # / XNA
आप फ़ीड के माध्यम से इस प्रविष्टि के लिए किसी भी प्रतिक्रियाओं का पालन कर सकते हैं आरएसएस 2.0 . आप भी लिख सकते हैं अपनी टिप्पणी , या अपने पृष्ठ पर लिंक इस पोस्ट के लिए.

3 / टिप्पणी

12 सितंबर, 2009
BartekB

वैसे मैं आपको बता सकता हूँ कि यहाँ टिप्पणी नहीं है, सामान्य रूप से एक उच्च स्तर पर पोस्ट.


15 सितंबर, 2009

एक बहुत ही दिलचस्प प्रविष्टि, ग्राफ के साथ नहीं खेलते हैं, लेकिन मैं यह खुशी के साथ पढ़ा. धन्यवाद!


1 जनवरी, 2012

मेरी नजर रखने के बाद, दुनिया में लोगों के हजारों व्यक्तिगत ऋण के विभिन्न लेनदारों से. इस प्रकार, वहाँ अच्छी संभावनाओं के लिए हर देश में एक वाणिज्यिक ऋण मिल.


  • Obraz CAPTCHY
    ताज़ा छवि
    *

    स्पैम संरक्षण WP-SpamFree