یاداشت های کوتاه یک برنامه نویس

طبقه بندی موضوعی

انتخاب spatial توسط موس (mousePicking) در JME3

دوشنبه, ۱۸ ارديبهشت ۱۳۹۶، ۰۷:۱۶ ق.ظ

در مثال های مستندات JmonkeyEngine در بخش ( Hello Picking) در مورد انتخاب یک geometry با موس چیز هایی گفته شده .....

اما کامل نیست و در یک مورد نیاز واقعی برای من کارایی نداشت، بیشتر اوقات هر مدل از بیشتر از یک geometry تشکیل شده است (مثلا مدل من از چند قسمت دست ،سر ، مو ، لباس ، بدن ، پا ، پوتین و غیره تشکیل شده که هر کدام یک geo در نظر گرفته میشود).و همچنین لازم بود به controller آن دسترسی داشته باشم که فقط والد تمام این ها این کنترلر را داشت نه فرزندان .

پس باید به spatial دسترسی پیدا می کردم  که والد تمام اجزای بدن مدل بود، برای اینکار geo ها را به سمت بالا در سلسله مراتب پدر فرزندی مرور میکنیم تا به یک برابری برسیم .(من برای هر چیز یک داده ی کلید مقدار ثبت میکنم مثلا id و npc را به مدل سربازهایی که توسط کامپیوتر کنترل میشوند نسبت می دهم تا بتوانم در یک حلقه بررسی کنم مورد انتخابی یک مدل از نوع npc است یا نه ؟بعد یک متد از کنترلر را اجرا میکنم تا رفتار مناسب داشته باشد ....)

پس در قسمت روی داد های موس :

private final String LMB = new String("lmb");

private ActionListener action = new ActionListener() { @Override public void onAction(String name, boolean isPressed, float tpf) { if (name.equalsIgnoreCase(LMB) && !isPressed) { Left_mouse_action(); } } };

 و در متد Left_mouse_action :

private void Left_mouse_action() {

       
            CollisionResults results = new CollisionResults();
            Vector2f click2d = app.getInputManager().getCursorPosition().clone();
            Vector3f click3d = app.getCamera().getWorldCoordinates(click2d, 0f).clone();
            Vector3f dir = app.getCamera().getWorldCoordinates(click2d, 1f).subtractLocal(click3d).normalizeLocal();
            Ray ray = new Ray(click3d, dir);
            rootNode.collideWith(ray, results);

            if (results.size() > 0) {
                // The closest collision point is what was truly hit:
                CollisionResult closest = results.getClosestCollision();
               
try { Spatial s = closest.getGeometry(); while (s != null) { if (s.getUserData("id").equals("npc")) { break; } s = s.getParent(); // check parent
}
npcController npcc= s.getControl(npcController.class);
npcc.moveTosafePlace(); } catch (NullPointerException NPex) { System.out.println("nothing clickable"); } } }

و کد های کنترلر  مهم نیست . تنها نکته ای که وجود داره اینه که در تقاطع ray با scene هر چیز که حجم دارد دو بار حساب میشود یک بار وقتی که ray وارد میشود و یک بار وقتی از طرف دیگر خارج میشود اما متدgetClosestCollision این طور نیست و فقط اولین برخورد را بر شامل میشود.

  • * RayanFar
  • تعداد بازدید کننده های این مطلب (۶۰) نفر و تعداد نمایش ها (۸۷) بار.

JmonkeyEngine

java

java game development

jme

jmonkey

mouse Picking

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">