2012-01-23 8 views
3

Google Sky Mapは数日前にオープンソースとして公開されているので、私はそれを試してみようとしています。残念ながら、ユーザーのクリック操作をオブジェクト(惑星など)にマッピングすることはできません。Google Sky Mapオープンソース - クリックアクションをオブジェクトにマップする方法は?

これのエントリーポイントはGestureInterceptor.onDown(MotionEvent e)だと思います。

しかし、MotionEventをオブジェクトにマップするにはどうすればよいですか?私はここで完全に失われています。

あなたはここにソースコードを見つけることができます:http://code.google.com/p/stardroid/source/browse/#svn%2Ftrunk%2Fapp

これまでに思い付いているもの:

AstronomerModel model = StardroidApplication.getModel(); 
Pointing pointing = model.getPointing(); 

だから私はモデルを持っていると私は視線を得ることができます。しかし、次に実行する必要があるのは、クリック座標を地心座標(how?)に変換し、その座標にあるオブジェクト(how?)を見つけることです。

答えて

1

これは私のやったことです。

私はGeocentric Positionsのラベルを取得し、それらをすべてApplicationConstantsクラスに格納しました。 ProtobufAstronomicalSource.getLabels()で取得できますが、PlanetSource.initialize()で取得できる惑星は例外です。

次に、ユーザーがクリックすると、onSingleTapConfirmedメソッドがクラスcom.google.android.stardroid.touch.GestureInterpreterで呼び出されます。このコードでは、すべてのラベルを取得し、このコードを使用してGeocentric Postionsをスクリーン位置に変換します。

@Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
     Log.d(TAG, "Confirmed single tap"); 

     Point screen = ApplicationConstants.getSizeOfScreen(); 
     int screenHeight = screen.y; 
     int screenWidth = screen.x; 
     float yClicked = screenHeight - e.getRawY(); //e.y is inverted, this normalizes it 
     float xClicked = e.getRawX(); 
     ArrayList<Label> labelArray = ApplicationConstants.getLabels(); 
     Log.d("LabelClicked", "label count: " + labelArray.size()); 
     ArrayList<LabelScreen> labelsOnScreen = new ArrayList<LabelScreen>(); 
     for (Label label : labelArray) { 
      //calculets current screen position of all labels, most of this code comes from LabelObjectManager.drawLabel() 
      Vector3 lookDir = ApplicationConstants.getLookDir(); 
      if (lookDir.x * label.x + lookDir.y * label.y + lookDir.z * label.z < ApplicationConstants.getmDotProductThreshold()) { 
       //return; 
      } 

      Vector3 mLabelOffset = ApplicationConstants.getmLabelOffset(); 

      // Offset the label to be underneath the given position (so a label will 
      // always appear underneath a star no matter how the phone is rotated) 
      Vector3 v = new Vector3(
       label.x - mLabelOffset.x * label.offset, 
       label.y - mLabelOffset.y * label.offset, 
       label.z - mLabelOffset.z * label.offset); 

      Vector3 screenPos = Matrix4x4.transformVector(
       ApplicationConstants.setTransformToScreenMatrix(), 
       v); 

      // We want this to align consistently with the pixels on the screen, so we 
      // snap to the nearest x/y coordinate, and add a magic offset of less than 
      // half a pixel. Without this, rounding error can cause the bottom and 
      // top of a label to be one pixel off, which results in a noticeable 
      // distortion in the text. 
      final float MAGIC_OFFSET = 0.25f; 
      screenPos.x = (int)screenPos.x + MAGIC_OFFSET; 
      screenPos.y = (int)screenPos.y + MAGIC_OFFSET; 

      //by Marcio Granzotto Rodrigues 
      if ((screenPos.x < 0.0f) | (screenPos.y < 0.0f)) { 
       //not on screen 
      }else if ((screenPos.x > screenWidth) | (screenPos.y > screenHeight)) { 
       //not on screen 
      }else if (screenPos.z < 0) { 
       //not on screen 
      }else { 
       //on screen 
       Log.d("LabelClicked", "on screen: " + label.getText() + " - " + screenPos.x + " " + screenPos.y + " " + screenPos.z); 
       LabelScreen labelScreen = new LabelScreen(label, screenPos); 
       labelsOnScreen.add(labelScreen); 
      }//end else 
     }//end for 

     Log.i("LabelClicked", "Labels on Screen: " + labelsOnScreen.size()); 
     LabelScreen theLabel = null; 
     for (LabelScreen labelScreen : labelsOnScreen) { 
      if (true) { //TODO check if label is on the clickable list 
       if (theLabel == null) { 
        //defines first label 
        theLabel = labelScreen; 
        Log.i("LabelClicked", "theLabel null -> " + theLabel.getLabel().getText()); 
       }else { 
        //check if this label is closer to the click area than theLabel 
        float theLabelRelativeX = theLabel.getScreenPos().x - xClicked; 
        float theLabelRelativeY = theLabel.getScreenPos().y - yClicked; 
        float myLabelRealativeX = labelScreen.getScreenPos().x - xClicked; 
        float myLabelRealativeY = labelScreen.getScreenPos().y - yClicked; 

        if ((Math.abs(myLabelRealativeX) < Math.abs(theLabelRelativeX)) 
          && (Math.abs(myLabelRealativeY) < Math.abs(theLabelRelativeY))) { 
         Log.i("LabelClicked", "theLabel " + theLabel.getLabel().getText() + " -> " + labelScreen.getLabel().getText()); 
         theLabel = labelScreen; 
        } 
       } 
      } 
     } 

     float theLabelRelativeX = theLabel.getScreenPos().x - xClicked; 
     float theLabelRelativeY = theLabel.getScreenPos().y - yClicked; 
     if ((theLabelRelativeX < screenWidth*0.1f) && (theLabelRelativeY < screenHeight*0.1f)) { 
      //clicked 
      if (theLabel.getLabel().getText().equals(ApplicationConstants.myContext.getString(com.google.android.stardroid.R.string.moon))) { 
       //ìf the clicked label is the moon, checks phase (in portuguese) 
       String moonPhase = ""; 
       switch (ApplicationConstants.getMoonPhase()) { 
       case ApplicationConstants.MOON_FULL: 
        moonPhase = " cheia"; 
        break; 
       case ApplicationConstants.MOON_CRESCENT: 
        moonPhase = " crescente"; 
        break; 
       case ApplicationConstants.MOON_NEW: 
        moonPhase = " nova"; 
        break; 
       case ApplicationConstants.MOON_GIBBOUS: 
        moonPhase = " minguante"; 
        break; 
       default: 
        break; 
       } 
       Toast.makeText(ApplicationConstants.myContext, theLabel.getLabel().getText() + moonPhase, Toast.LENGTH_SHORT).show(); 
       Log.i("LabelClicked", "You clicked: " + theLabel.getLabel().getText() + moonPhase); 
      }else { 
       Toast.makeText(ApplicationConstants.myContext, theLabel.getLabel().getText(), Toast.LENGTH_SHORT).show(); 
       Log.i("LabelClicked", "You clicked: " + theLabel.getLabel().getText()); 
      } 
     } 
     return false; 
     } 

+0

あなたは共有できますかApplicationContantsクラス –

関連する問題