POI的广告牌未显示

时间:2015-02-05 18:47:09

标签: android metaio point-of-interest

我正在使用ARexampleLocationBased教程,POIS ar正确显示,但未显示annottations,程序工作正常,但POI上的billoboards图像不可见

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;
    }
}

}

有人知道出了什么问题吗?

1 个答案:

答案 0 :(得分:0)

如果您使用skd 5.3或更高版本,则必须将教程(example_SDK)的assets / junaio文件夹复制到您的资源文件夹中,以便显示您的poi。 我刚刚发现它正在努力知道这一点。我的poi.obj旋转...