سؤال

لا بد لي من استخدام OGRE3D لمشروع جامعي ومع ذلك، لا يسمح لنا باستخدام أي مكتبات طرف ثالث للفيزياء أو اكتشاف الاصطدام. ويشمل ذلك استخدام ogre المدمج في اكتشاف الاصطدام.

أواجه بعضا من الصعوبة بالطريقة الصحيحة للاتصال بإضافة إجراءات الفيزياء المخصصة الخاصة بي إلى كيانات OGRE المبنية.

يستخدم OGRE كائنات "الكيان" باعتبارها الأكثر أساسا لبنات البناء وللفيزياء التي تحتاج إلى كائنات لها سمات كتلة وسرعة وما إلى ذلك.

الشيء الذي أقيم فيه هو أن حلقات Render / Logic OGRE تبدو مخفية من المستخدم داخل محرك Ogre. هذه مشكلة لأنني بحاجة إلى أن أكون قادرا على الحصول على كل كيان في OGRE وأداء حسابات الكشف عن التصادم والفيزياء مع محرك الفيزياء المخصص الذي أقوم به.

كيف يمكنني دمج فئات المحرك في الفيزياء / التصادم الخاصة بي مع OGRE؟

تحديث: أخذ النصيحة أدناه لدي فرعية ogre :: كيان، أي:

class PhysicsEntity : public Ogre::Entity;

PhysicsEntity *ent1 = (PhysicsEntity*)mSceneMgr->createEntity("PhysicsNinja", "ninja.mesh");;
SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode("NinjaNode1");
node2->attachObject((Ogre::Entity*)ent1);

الدولة التعليقات ليست هذه هي أفضل طريقة لجمعية كومفورم إلى OO، وأستطيع أن أرى طريقة أفضل في هذه المرحلة؟ ما رأيك وهل لديك أي أفكار أفضل لأنني لست سعيدا تماما بالقيام بذلك.

هل كانت مفيدة؟

المحلول

إجابة جايسون ويليامز تظهر المسار الصحيح. الطريقة الممكنة هي إدخال فئة مستقلة تمثل gameobject الخاص بك. (دعونا نسميها وبالتالي لبقية الإجابة، حتى لو لم تقم بإنشاء لعبة)

تطبق فئة Gamebject هذه جميع الجوانب ذات الصلة من النينجا وصناديقك وأي شيء واختبئ الجوانب الجسدية والرسمية عن طريق تكوين الطبقات الأخرى التي تمثلها. على سبيل المثال graphicalobject، الفظيمي.

إليك مثال مبسلي للغاية:

class GameObject
{
public:
   void setPosition(Vector3 pos)
   {
      m_position = pos;
      m_graphical->setPosition(pos);
      m_physical->setPosition(pos);
   }

private:
   GraphicalObject m_graphical;
   PhysicalObject m_physical;
   Vector3 m_position;
}

الآن GraphicalObject يغلق Ogre :: سيناتينود مع ogre :: كيان المرفقة. IssicalObject يغلف فئة الجسم المادي. قد يشارك كلا من الفيزياء و GraphicalObjects فئة أساسية مشتركة تحدد الواجهة لفئة GameObject. أعلاه استخدمت الوظائف الفعلية مثل SetPosition، ولكن عادة ما أوصي بواجهة رسائل أكثر عمومية، ولكن ربما لا يجب أن تكون معقدة للغاية في قضيتك.

لا تزال مشكلة واحدة هي أنك تريد وضع لعبة GameObject للرد على التغييرات في خطوة المحاكاة البدنية الخاصة بك. هذا يعتمد بشكل كبير على كيفية تصميم محرك الفيزياء الخاص بك. ولكن إذا كان لديك نوع من نظام رد الاتصال، فقم بتسجيل الفيزياء الخاصة بك كمستمع لأي أحداث فيما يتعلق بهذا وتغيير الموقف من. نفس الشيء للتوجيه أو التحويل بشكل عام، إذا كنت لا تميز بين الموقف والتوجيه على وجه التحديد.

ربما تريد أن تستمد خصائص الجسم المادي (دعونا نسميها هيئة تكنولوجيا المعلومات لهذه الإجابة) من الشبكة التي تمثل الرسومات. في حالة النينجا، يجب أن يشبه شكله بطريقة أو بأخرى من شبكة النينجا. سأفعل هذا مع فئة مساعد بسيطة خارج التسلسل الهرمي للفئة. على سبيل المثال bloomfactory.

class BodyFactory
{
public:
   static Body* createEllipsoidBody(MeshPtr mesh);
   static Body* createCuboidBody(MeshPtr mesh);
   static Body* createConvexHullBody(MeshPtr mesh);
}

هذه الوظائف تخلق التمثيل الفيزيائي المناسب لمحرك الفيزياء الخاص بك من بيانات الشبكة. في الحالة البسيطة التي يستخدمونها فقط المربع المحيط، أو للحصول على أجسام أكثر تطورا يقومون بتقييم بيانات قمة الرأس الفعلية، لا يهم. ربما يمكنك تمديد الواجهة للسمات المادية غير المخزنة في الشبكة (وزن معين، ومعدات الجمود (جوفاء، صلب، إلخ))

المشورة العامة لا تزال عند استخدام Ogre (أو أي محرك رسومات نقية): استخدمها فقط للرسومات. أفهم أن تنفيذ مشاريع OGRE يطرح استخدامه لإدارة المشهد الخاصة بك، لكنك تربط نفسك بالمحرك كثيرا، وتحميل واجهاتك مع الأشياء التي لا يحتاجون إليها ولا تريد أن تعتمد عليهم. فيمبدأ فصل واجهة) ليس فقط يستحق المتاعب. إبقاء الأشياء منفصلة حقا أسهل في الإدارة والحفاظ عليها.

نصائح أخرى

غالبا ما تريد كائن فيزياء بدون أي رسومات وكائن فيزياء مع رسومات متعددة أو كائن رسومات تمثل كائنات فيزياء متعددة.

بسبب هذا (وأسباب أخرى، مثل القدرة على تبديل محركات الفيزياء / الرسومات المختلفة داخل وخارج)، احتفظ معظم المحركات بالأنظمة منفصلة إلى حد ما، فقط باستخدام المراجع / الروابط بين نظام الرسومات والفيزياء (بحيث كائنات الفيزياء يمكن تحديث كيانات الرسومات بعد إجراء خطوة محاكاة)

بمجرد أن قرأت سؤالك، كنت سأجرضك إلى Ogreode، والتي توفر جسر جميل بين OGRE3D وندود. إذا لم تستخدم ODE، فربما يجب أن تكون هناك إلقاء نظرة عليه، للحصول على بعض تلميحات حول كيفية القيام بذلك؟ هناك أيضا ogrenewt، محرك مماثل.

أعتقد أنك بحاجة إلى تثبيت Framelistener، يتم استدعاؤه بعد تقديم إطار. ثم يمكنك الوصول إلى Seenemanager وشوهاتها، وقراءة وتغيير مواقفها.

ومع ذلك، فإن الشبكات، إلا إذا كانت الأشكال الأساسية، غير قابلة للحياة للغاية مثل نموذج للكشف عن التصادم، إذا كنت ترغب في الحصول على أداء لائق. هذا هو السبب في أنني أعتقد أنك يجب أن تضاء كياناتك مع عدد قليل من الأشكال الأساسية (مكعب، كرة، إلخ) والعمل مع هذه بدلا من تنسجم الكيان. فئة فرعية كيانات OGRE3D ومنحهم مجموعة من الأشكال الأساسية وملحق لهم. ثم يحصل Framelistener الخاص بك على الأشكال الأساسية لكل سينات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top