2015-02-05 42 views
0

我使用ARexampleLocationBased教程,POI的AR顯示正確,但annottations沒有顯示,,程序工作正確的,但在billoboards圖像下來的POI是不可見的POI的廣告牌不顯示

package pfg.proyecto.com.proyecto; 

import android.view.View; 

import com.metaio.sdk.ARELActivity; 


public class ARELViewActivity extends ARELActivity 
{ 
    @Override 
protected int getGUILayout() 
{ 
    return R.layout.activity_main; 
} 

public void onButtonClick(View v) 
{ 
    finish(); 
} 

} 

這是主要的活動代碼

package pfg.proyecto.com.proyecto; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.TextPaint; 
import android.util.Log; 
import android.view.View; 

import com.metaio.cloud.plugin.util.MetaioCloudUtils; 
import com.metaio.sdk.ARELInterpreterAndroidJava; 
import com.metaio.sdk.ARViewActivity; 
import com.metaio.sdk.MetaioDebug; 
import com.metaio.sdk.jni.AnnotatedGeometriesGroupCallback; 
import com.metaio.sdk.jni.EGEOMETRY_FOCUS_STATE; 
import com.metaio.sdk.jni.IAnnotatedGeometriesGroup; 
import com.metaio.sdk.jni.IGeometry; 
import com.metaio.sdk.jni.IMetaioSDKCallback; 
import com.metaio.sdk.jni.IRadar; 
import com.metaio.sdk.jni.ImageStruct; 
import com.metaio.sdk.jni.LLACoordinate; 
import com.metaio.sdk.jni.Rotation; 
import com.metaio.sdk.jni.SensorValues; 
import com.metaio.sdk.jni.Vector3d; 
import com.metaio.tools.io.AssetsManager; 

import java.io.File; 
import java.io.IOException; 
import java.util.concurrent.locks.Lock; 

public class MainActivity extends ARViewActivity 
{ 
    private IAnnotatedGeometriesGroup mAnnotatedGeometriesGroup; 

    private MyAnnotatedGeometriesGroupCallback mAnnotatedGeometriesGroupCallback; 

/** 
* Geometries 
*/ 
private IGeometry mLondonGeo; 
private IGeometry mMunichGeo; 
private IGeometry mRomeGeo; 
private IGeometry mTokyoGeo; 
private IGeometry mParisGeo; 


private IRadar mRadar; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // Set GPS tracking configuration 
    boolean result = metaioSDK.setTrackingConfiguration("GPS", false); 
    new LoadAssets().execute(0); 
    MetaioDebug.log("Tracking data loaded: " + result); 
} 

@Override 
protected void onDestroy() 
{ 
    // Break circular reference of Java objects 
    if (mAnnotatedGeometriesGroup != null) 
    { 
     mAnnotatedGeometriesGroup.registerCallback(null); 
    } 

    if (mAnnotatedGeometriesGroupCallback != null) 
    { 
     mAnnotatedGeometriesGroupCallback.delete(); 
     mAnnotatedGeometriesGroupCallback = null; 
    } 

    super.onDestroy(); 
} 

@Override 
public void onDrawFrame() 
{ 
    if (metaioSDK != null && mSensors != null) 
    { 
     SensorValues sensorValues = mSensors.getSensorValues(); 

     float heading = 0.0f; 
     if (sensorValues.hasAttitude()) 
     { 
      float m[] = new float[9]; 
      sensorValues.getAttitude().getRotationMatrix(m); 

      Vector3d v = new Vector3d(m[6], m[7], m[8]); 
      v.normalize(); 

      heading = (float)(-Math.atan2(v.getY(), v.getX()) - Math.PI/2.0); 
     } 

     IGeometry geos[] = new IGeometry[] {mLondonGeo, mParisGeo, mRomeGeo, mTokyoGeo,}; 
     Rotation rot = new Rotation((float)(Math.PI/2.0), 0.0f, -heading); 
     for (IGeometry geo : geos) 
     { 
      if (geo != null) 
      { 
       geo.setRotation(rot); 
      } 
     } 
    } 

    super.onDrawFrame(); 
} 

public void onButtonClick(View v) 
{ 
    finish(); 
} 

@Override 
protected int getGUILayout() 
{ 
    return R.layout.activity_main; 
} 

@Override 
protected IMetaioSDKCallback getMetaioSDKCallbackHandler() 
{ 
    return null; 
} 

@Override 
protected void loadContents() 
{ 
    mAnnotatedGeometriesGroup = metaioSDK.createAnnotatedGeometriesGroup(); 
    mAnnotatedGeometriesGroupCallback = new MyAnnotatedGeometriesGroupCallback(); 
    mAnnotatedGeometriesGroup.registerCallback(mAnnotatedGeometriesGroupCallback); 

    // Clamp geometries' Z position to range [5000;200000] no matter how close or far they are 
    // away. 
    // This influences minimum and maximum scaling of the geometries (easier for development). 
    metaioSDK.setLLAObjectRenderingLimits(5, 200); 

    // Set render frustum accordingly 
    metaioSDK.setRendererClippingPlaneLimits(10, 220000); 

    // let's create LLA objects for known cities 
    LLACoordinate munich = new LLACoordinate(48.142573, 11.550321, 0, 0); 
    LLACoordinate london = new LLACoordinate(51.50661, -0.130463, 0, 0); 
    LLACoordinate tokyo = new LLACoordinate(35.657464, 139.773865, 0, 0); 
    LLACoordinate rome = new LLACoordinate(41.90177, 12.45987, 0, 0); 
    LLACoordinate paris = new LLACoordinate(48.85658, 2.348671, 0, 0); 
    LLACoordinate parque = new LLACoordinate(36.465985, -6.201081, 0, 0); 

    // Load some POIs. Each of them has the same shape at its geoposition. We pass a string 
    // (const char*) to IAnnotatedGeometriesGroup::addGeometry so that we can use it as POI 
    // title 
    // in the callback, in order to create an annotation image with the title on it. 
    mLondonGeo = createPOIGeometry(london); 
    mAnnotatedGeometriesGroup.addGeometry(mLondonGeo, "London"); 

    mParisGeo = createPOIGeometry(paris); 
    mAnnotatedGeometriesGroup.addGeometry(mParisGeo, "Paris"); 

    mRomeGeo = createPOIGeometry(rome); 
    mAnnotatedGeometriesGroup.addGeometry(mRomeGeo, "Rome"); 

    mTokyoGeo = createPOIGeometry(tokyo); 
    mAnnotatedGeometriesGroup.addGeometry(mTokyoGeo, "Tokyo"); 



    File metaioManModel = 
      AssetsManager.getAssetPathAsFile(getApplicationContext(), 
        "metaioman.md2"); 
    if (metaioManModel != null) 
    { 
     mMunichGeo = metaioSDK.createGeometry(metaioManModel); 
     if (mMunichGeo != null) 
     { 
      mMunichGeo.setTranslationLLA(munich); 
      mMunichGeo.setLLALimitsEnabled(true); 
      mMunichGeo.setScale(500); 
     } 
     else 
     { 
      MetaioDebug.log(Log.ERROR, "Error loading geometry: " + metaioManModel); 
     } 
    } 

    // create radar 
    mRadar = metaioSDK.createRadar(); 
    mRadar.setBackgroundTexture(AssetsManager.getAssetPathAsFile(getApplicationContext(), 
      "radar.png")); 
    mRadar.setObjectsDefaultTexture(AssetsManager.getAssetPathAsFile(getApplicationContext(), 
      "yellow.png")); 
    mRadar.setRelativeToScreen(IGeometry.ANCHOR_TL); 

    // add geometries to the radar 
    mRadar.add(mLondonGeo); 
    mRadar.add(mMunichGeo); 
    mRadar.add(mTokyoGeo); 
    mRadar.add(mParisGeo); 
    mRadar.add(mRomeGeo); 
} 

private IGeometry createPOIGeometry(LLACoordinate lla) 
{ 
    final File path = 
      AssetsManager.getAssetPathAsFile(getApplicationContext(), 
        "ExamplePOI.obj"); 
    if (path != null) 
    { 
     IGeometry geo = metaioSDK.createGeometry(path); 
     geo.setTranslationLLA(lla); 
     geo.setLLALimitsEnabled(true); 
     geo.setScale(100); 
     return geo; 
    } 
    else 
    { 
     MetaioDebug.log(Log.ERROR, "Missing files for POI geometry"); 
     return null; 
    } 
} 

@Override 
protected void onGeometryTouched(final IGeometry geometry) 
{ 
    MetaioDebug.log("Geometry selected: " + geometry); 

    mSurfaceView.queueEvent(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      mRadar.setObjectsDefaultTexture(AssetsManager.getAssetPathAsFile(getApplicationContext(), 
        "yellow.png")); 
      mRadar.setObjectTexture(geometry, AssetsManager.getAssetPathAsFile(getApplicationContext(), 
        "red.png")); 
      mAnnotatedGeometriesGroup.setSelectedGeometry(geometry); 
     } 
    }); 
} 

final class MyAnnotatedGeometriesGroupCallback extends AnnotatedGeometriesGroupCallback 
{ 
    Bitmap mAnnotationBackground, mEmptyStarImage, mFullStarImage; 
    int mAnnotationBackgroundIndex; 
    ImageStruct texture; 
    String[] textureHash = new String[1]; 
    TextPaint mPaint; 
    Lock geometryLock; 


    Bitmap inOutCachedBitmaps[] = new Bitmap[] {mAnnotationBackground, mEmptyStarImage, mFullStarImage}; 
    int inOutCachedAnnotationBackgroundIndex[] = new int[] {mAnnotationBackgroundIndex}; 

    public MyAnnotatedGeometriesGroupCallback() 
    { 
     mPaint = new TextPaint(); 
     mPaint.setFilterBitmap(true); // enable dithering 
     mPaint.setAntiAlias(true); // enable anti-aliasing 
    } 

    @Override 
    public IGeometry loadUpdatedAnnotation(IGeometry geometry, Object userData, IGeometry existingAnnotation) 
    { 
     if (userData == null) 
     { 
      return null; 
     } 

     if (existingAnnotation != null) 
     { 
      // We don't update the annotation if e.g. distance has changed 
      return existingAnnotation; 
     } 

     String title = (String)userData; // as passed to addGeometry 
     LLACoordinate location = geometry.getTranslationLLA(); 
     float distance = (float)MetaioCloudUtils.getDistanceBetweenTwoCoordinates(location, mSensors.getLocation()); 
     Bitmap thumbnail = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
     try 
     { 
      texture = 
        ARELInterpreterAndroidJava.getAnnotationImageForPOI(title, title, distance, "5", thumbnail, 
          null, 
          metaioSDK.getRenderSize(), MainActivity.this, 
          mPaint, inOutCachedBitmaps, inOutCachedAnnotationBackgroundIndex, textureHash); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      if (thumbnail != null) 
       thumbnail.recycle(); 
      thumbnail = null; 
     } 

     mAnnotationBackground = inOutCachedBitmaps[0]; 
     mEmptyStarImage = inOutCachedBitmaps[1]; 
     mFullStarImage = inOutCachedBitmaps[2]; 
     mAnnotationBackgroundIndex = inOutCachedAnnotationBackgroundIndex[0]; 

     IGeometry resultGeometry = null; 

     if (texture != null) 
     { 
      if (geometryLock != null) 
      { 
       geometryLock.lock(); 
      } 

      try 
      { 
       // Use texture "hash" to ensure that SDK loads new texture if texture changed 
       resultGeometry = metaioSDK.createGeometryFromImage(textureHash[0], texture, true, false); 
      } 
      finally 
      { 
       if (geometryLock != null) 
       { 
        geometryLock.unlock(); 
       } 
      } 
     } 

     return resultGeometry; 
    } 

    @Override 
    public void onFocusStateChanged(IGeometry geometry, Object userData, EGEOMETRY_FOCUS_STATE oldState, 
            EGEOMETRY_FOCUS_STATE newState) 
    { 
     MetaioDebug.log("onFocusStateChanged for " + (String)userData + ", " + oldState + "->" + newState); 
    } 
} 

public class LoadAssets extends AsyncTask<Integer, Integer, Boolean> { 
    @Override 
    protected Boolean doInBackground(Integer... params) { 
     try 
     { 
      // Extract all assets and overwrite existing files if debug build 
      AssetsManager.extractAllAssets(getApplicationContext(), BuildConfig.DEBUG); 
     } 
     catch (IOException e) 
     { 
      MetaioDebug.log(Log.ERROR, "Error extracting assets: " + e.getMessage()); 
      MetaioDebug.printStackTrace(Log.ERROR, e); 
      return false; 
     } 
     return true; 
    } 
} 

}

有人知道什麼是錯的?

回答

0

如果您使用skd 5.3或更高版本,則必須將tutorial(example_SDK)的assets/junaio文件夾複製到您的資產文件夾中,以便顯示您的poi。 我剛剛發現它,我正在研究這項權利。我的poi.obj旋轉...