JME2(JavaMonkeyEngine2):選擇物體并且在縮略圖中顯示. 鼠標右鍵按下旋轉視角

          發現BlogJava沒以前人氣旺了...首頁都沒啥人更新了..那我在寫一個吧.

          一個小程序 ..支持鼠標左鍵點擊  右鍵按下可旋轉  縮略圖可以展示被點擊的物體.




          功能:左邊是個縮略圖.白框外面是場景...要求點擊場景中的任何一個物體并且將物體顯示在縮略圖中..并且鼠標要求左鍵無法移動視角只可點擊..右鍵只有在按下時 才可旋轉視角.

          要實現這個效果..我們一步一步來..
          首先是初始化 我們先將 攝象機 燈光 模型 等等都將在這里一次生成.

          protected void simpleInitGame() {
          display.setTitle(
          "PickBox Demo");


          // 安裝攝象機
          cam.setFrustumPerspective(45.0f, (float) display.getWidth()
          / (float) display.getHeight(), 15000);
          cam.setLocation(
          new Vector3f(200150200));
          cam.lookAt(
          new Vector3f(000), Vector3f.UNIT_Y);
          cam.update();


          pr 
          = new BoundingPickResults();
          am 
          = new AbsoluteMouse("The Mouse", display.getWidth(), display
          .getHeight());
          am.registerWithInputHandler(input);


          // 安裝燈光系統
          PointLight light = new PointLight();
          light.setDiffuse(
          new ColorRGBA(1.0f1.0f1.0f1.0f));
          light.setAmbient(
          new ColorRGBA(0.5f0.5f0.5f1.0f));
          light.setLocation(
          new Vector3f(0300));
          light.setEnabled(
          true);
          lightState.attach(light);


          // Objects 所有可選的物體都將加到這個Node里 rootNode.attachChild(createObjects());


          // Setup renderpasses
          RenderPass rootPass = new RenderPass();
          rootPass.add(rootNode);
          pManager.add(rootPass);


          createDebugQuads();
          statNode.attachChild(debugQuadsNode);
          //為了讓鼠標左鍵不隨鼠標自動旋轉視角 我們首先要將鼠標釋放出來
          MouseInput.get().setCursorVisible(true);
          }

          //objects 所有可以讓鼠標選擇的物體都應該加載到這個Node上面
          //因為我們會在Update方法中 使用BoundingPickResults 來尋找這個Node
              private Node createObjects() {
          objects 
          = new Node("objects");


          ts 
          = display.getRenderer().createTextureState();
          Texture t0 
          = TextureManager.loadTexture(PickBoxDemo.class.getClassLoader()
          .getResource(
          "jmetest/data/texture/wall.jpg"),
          Texture.MinificationFilter.Trilinear,
          Texture.MagnificationFilter.Bilinear);
          t0.setWrap(Texture.WrapMode.Repeat);
          ts.setTexture(t0);


          textureBox 
          = new Box("box1"new Vector3f(-10-10-10), new Vector3f(10,
          1010));
          textureBox.setLocalTranslation(
          new Vector3f(0100));
          textureBox.setRenderState(ts);
          textureBox.setModelBound(
          new BoundingBox());
          textureBox.updateModelBound();
          objects.attachChild(textureBox);


          whiteBox 
          = new Box("box2"new Vector3f(-5-5-5), new Vector3f(555));
          whiteBox.setLocalTranslation(
          new Vector3f(0300));
          whiteBox.setModelBound(
          new BoundingBox());
          whiteBox.updateModelBound();
          objects.attachChild(whiteBox);


          shadowBox 
          = new Box("sn"new Vector3f(-5-5-5), 555);
          shadowBox.setLocalTranslation(
          new Vector3f(01010));
          shadowBox.setModelBound(
          new BoundingBox());
          shadowBox.updateModelBound();


          return objects;
          }

           下面將創建縮略圖周圍的白色框框
          private void createDebugQuads() {
          tRenderer 
          = display.createTextureRenderer(256256,
          TextureRenderer.Target.Texture2D);
          tRenderer.getCamera().setAxes(
          new Vector3f(-100),
          new Vector3f(001), new Vector3f(010));
          tRenderer.getCamera().setLocation(
          new Vector3f(0-10020));


          monitorNode 
          = new Node("Monitor Node");
          monitorNode.setRenderQueueMode(Renderer.QUEUE_ORTHO);
          Quad quad 
          = new Quad("Monitor");
          quad.updateGeometry(
          250250);
          quad.setLocalTranslation(
          new Vector3f(1502100));
          quad.setZOrder(
          1);
          monitorNode.attachChild(quad);


          Quad quad2 
          = new Quad("Monitor Back");
          quad2.updateGeometry(
          270270);
          quad2.setLocalTranslation(
          new Vector3f(1502100));
          quad2.setZOrder(
          2);
          monitorNode.attachChild(quad2);


          ZBufferState buf 
          = display.getRenderer().createZBufferState();
          buf.setEnabled(
          false);


          monitorNode.setRenderState(buf);


          tRenderer.setBackgroundColor(
          new ColorRGBA(0f, 0f, 0f, 1f));
          fakeTex 
          = new Texture2D();
          fakeTex.setRenderToTextureType(Texture.RenderToTextureType.RGBA);
          tRenderer.setupTexture(fakeTex);
          TextureState screen 
          = display.getRenderer().createTextureState();
          screen.setTexture(fakeTex);
          screen.setEnabled(
          true);
          quad.setRenderState(screen);


          monitorNode.setLightCombineMode(Spatial.LightCombineMode.Off);
          rootNode.attachChild(monitorNode);
          }

          //我們將用Texture2D的方式將框框放到界面里 那將是一個Quad 四邊形 .


          //接下來是我們最核心的方法
          protected void simpleUpdate()//我們首先來判斷 是否是左鍵點擊 這里的isButtonDown(0) 中的 0  代表的就是左鍵 if
          (MouseInput.get().isButtonDown(0)) { Vector2f screenPos = new
          Vector2f(); screenPos.set(am.getHotSpotPosition().x,
          am.getHotSpotPosition().y); Vector3f worldCoords 
          =
          display.getWorldCoordinates(screenPos, 
          0); Vector3f worldCoords2 =
          display.getWorldCoordinates(screenPos, 
          1); Ray mouseRay = new
          Ray(worldCoords, worldCoords2.subtractLocal(
          worldCoords).normalizeLocal()); pr.clear();
          //為了讓 BoundingPickResults 可以點擊 objects內的所有模型
          objects.findPick(mouseRay, pr);
          try {
          //我們會通過pickResults拿到我們點擊當前的第1個Node.并且拿到Node的Nmae.接著我們判斷并且將點擊的Box 復制給縮略圖里的Box..這樣。他就進去了 String name =
          pr.getPickData(0).getTargetMesh().getName(); if
          (name.equalsIgnoreCase(
          "box1")) { shadowBox = textureBox; } else if
          (name.equalsIgnoreCase(
          "box2")) { shadowBox = whiteBox; } }
           catch
          (IndexOutOfBoundsException ex) 
          { ex.printStackTrace(); } }

          }



          接下來我們是鼠標的處理...由于要求是鼠標右鍵按下時并且拖動鼠標 才可以旋轉視角 OK
          那么我們可以在MouseLook的performAction里 增加一些條件 來實現這個效果

          public void performAction(InputActionEvent evt) {
                  
          float time = 0.01f * speed;
          //首先看鼠標是否右鍵按下 如果按下 .setCursorVisible(false); 讓光標隱藏掉并且移動視角
                  if(MouseInput.get().isButtonDown(1)){
                   MouseInput.get().setCursorVisible(
          false);
                           
          if(!buttonPressRequired || MouseInput.get().isButtonDown(mouseButtonForRequired)) {
                   
          if (mouse.getLocalTranslation().x > 0{
                   event.setTime(time 
          * mouse.getLocalTranslation().x);
                   rotateRight.performAction(event);
                   }
           else if (mouse.getLocalTranslation().x < 0{
                   event.setTime(time 
          * mouse.getLocalTranslation().x * -1);
                   rotateLeft.performAction(event);
                   }

                   
          if (mouse.getLocalTranslation().y > 0{
                   event.setTime(time 
          * mouse.getLocalTranslation().y);
                   lookUp.performAction(event);
                   }
           else if (mouse.getLocalTranslation().y < 0{
                   event.setTime(time 
          * mouse.getLocalTranslation().y * -1);
                   lookDown.performAction(event);
                   }

                   }

                  }

          //當鼠標右鍵抬起后 我們將在光標顯示出來.
                  if(!MouseInput.get().isButtonDown(1)){
          MouseInput.get().setCursorVisible(
          true);
          }

              }



          源代碼下載:點擊下載

          posted on 2011-03-24 17:52 相信 閱讀(2011) 評論(0)  編輯  收藏 所屬分類: JME 2/3

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          公告

          不顯示applet

          常用鏈接

          留言簿(16)

          我參與的團隊

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          swingchina 專業搞Swing的網站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 常宁市| 兴化市| 岳普湖县| 伊金霍洛旗| 泸溪县| 同仁县| 泰和县| 龙里县| 泰兴市| 宁海县| 井冈山市| 陆川县| 夏河县| 马尔康县| 开原市| 阜宁县| 吐鲁番市| 湘西| 陈巴尔虎旗| 福清市| 杭锦后旗| 温泉县| 台湾省| 凤凰县| 望奎县| 东丽区| 通江县| 象山县| 天水市| 城口县| 长兴县| 隆子县| 闸北区| 炎陵县| 棋牌| 平顺县| 承德县| 彰武县| 贵溪市| 紫金县| 绥中县|