2013-03-04 2 views
8

В Android, я пытаюсь интегрировать JPCT в Vuforia с помощью этого учебника: http://www.jpct.net/wiki/index.php/Integrating_JPCT-AE_with_VuforiaИнтеграция jpct-ае к двигателю Vuforia компании Qualcomm в андроида

Первый раз, когда приложение запускается, он работает, но когда я иду назад, и я снова нажимаю «играть», он падает.

Эти ошибки в моем LogCat, когда происходит сбой приложения:

FATAL EXCEPTION: main 
java.lang.RuntimeException: [ 1362671862690 ] - ERROR: A texture with the name 'texture' has been declared twice! 
at com.threed.jpct.Logger.log(Logger.java:189) 
at com.threed.jpct.TextureManager.addTexture(TextureManager.java:138) 
at com.qualcomm.QCARSamples.ImageTargets.ImageTargetsRenderer.<init> (ImageTargetsRenderer.java:78) 
at  com.qualcomm.QCARSamples.ImageTargets.ImageTargets.initApplicationAR(ImageTargets.java:807) 
at com.qualcomm.QCARSamples.ImageTargets.ImageTargets.updateApplicationStatus(ImageTargets.java:649) 
at com.qualcomm.QCARSamples.ImageTargets.ImageTargets.updateApplicationStatus(ImageTargets.java:641) 
at com.qualcomm.QCARSamples.ImageTargets.ImageTargets.access$3(ImageTargets.java:598) 
at com.qualcomm.QCARSamples.ImageTargets.ImageTargets$InitQCARTask.onPostExecute(ImageTargets.java:226) 
at com.qualcomm.QCARSamples.ImageTargets.ImageTargets$InitQCARTask.onPostExecute(ImageTargets.java:1) 
at android.os.AsyncTask.finish(AsyncTask.java:417) 
at android.os.AsyncTask.access$300(AsyncTask.java:127) 
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:3691) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
at dalvik.system.NativeStart.main(Native Method) 

Вот Imagetargetsrenderer.java код

public class ImageTargetsRenderer implements GLSurfaceView.Renderer 
{ 
public boolean mIsActive = false; 

/** Reference to main activity **/ 
public ImageTargets mActivity; 

/** Native function for initializing the renderer. */ 
public native void initRendering(); 

/** Native function to update the renderer. */ 
public native void updateRendering(int width, int height); 

private World world=null; 
private Light sun = null; 
private Object3D cube = null; 
private FrameBuffer fb = null; 
private float[] modelViewMat=null; 
private Camera cam=null; 
private float fov=0; 
private float fovy=0; 

//private Camera cam=null; 
private Object3D plane=null; 

public ImageTargetsRenderer(ImageTargets activity){ 
    this.mActivity = activity; 
    world = new World(); 
world.setAmbientLight(20, 20, 20); 

sun = new Light(world); 
sun.setIntensity(250, 250, 250); 

// Create a texture out of the icon...:-) 
Texture texture = new Texture(BitmapHelper.rescale(BitmapHelper.convert(mActivity.getResources().getDrawable(R.drawable.ic_launcher)), 64, 64)); 
TextureManager.getInstance().addTexture("texture", texture); 

cube = Primitives.getCube(10); 
cube.calcTextureWrapSpherical(); 
cube.setTexture("texture"); 
cube.strip(); 
cube.build(); 

world.addObject(cube); 

cam = world.getCamera(); 
/*cam.moveCamera(Camera.CAMERA_MOVEOUT, 50); 
cam.lookAt(cube.getTransformedCenter());*/ 

SimpleVector sv = new SimpleVector(); 
SimpleVector position=new SimpleVector(); 
position.x=0; 
position.y=0; 
position.z=-10; 

cube.setOrigin(position); 
sv.set(cube.getTransformedCenter()); 
sv.y -= 100; 
sv.z -= 100; 

sun.setPosition(sv); 
MemoryHelper.compact(); 

} 




/** Called when the surface is created or recreated. */ 
public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{ 
    DebugLog.LOGD("GLRenderer::onSurfaceCreated"); 

    // Call native function to initialize rendering: 
    initRendering(); 

    // Call QCAR function to (re)initialize rendering after first use 
    // or after OpenGL ES context was lost (e.g. after onPause/onResume): 
    QCAR.onSurfaceCreated(); 
} 


/** Called when the surface changed size. */ 
public void onSurfaceChanged(GL10 gl, int width, int height) 
{ 
    DebugLog.LOGD("GLRenderer::onSurfaceChanged"); 

    // Call native function to update rendering when render surface 
    // parameters have changed: 
    updateRendering(width, height); 

    // Call QCAR function to handle render surface size changes: 
    QCAR.onSurfaceChanged(width, height); 

    if (fb != null) { 
     fb.dispose(); 
    } 
    fb = new FrameBuffer(width, height); 
} 


/** The native render function. */ 
public native void renderFrame(); 


/** Called to draw the current frame. */ 
public void onDrawFrame(GL10 gl) 
{ 
    if (!mIsActive) 
     return; 

    // Update render view (projection matrix and viewport) if needed: 
    mActivity.updateRenderView(); 

    //updateCamera(); 

    // Call our native function to render content 

    renderFrame(); 

    world.renderScene(fb); 

    world.draw(fb); 

    fb.display(); 

} 

public void updateModelviewMatrix(float mat[]) { 
    modelViewMat = mat; 
} 

public void setFov(float fov_) { 
    fov = fov_; 
} 

public void setFovy(float fovy_) { 
    fovy = fovy_; 
} 

public void updateCamera() { 
    Matrix m = new Matrix(); 
    m.setDump(modelViewMat); 
     cam.setBack(m); 
     cam.setFOV(fov); 
     cam.setYFOV(fovy); 

} 

} 

Код для imagetargets.cpp

JNIEXPORT void JNICALL 
Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_renderFrame(JNIEnv *env, jobject obj) 
{ 

const QCAR::CameraCalibration& cameraCalibration =  QCAR::CameraDevice::getInstance().getCameraCalibration(); 
QCAR::Vec2F size = cameraCalibration.getSize(); 
QCAR::Vec2F focalLength = cameraCalibration.getFocalLength(); 
float fovyRadians = 2 * atan(0.5f * size.data[1]/focalLength.data[1]); 
float fovRadians = 2 * atan(0.5f * size.data[0]/focalLength.data[0]); 

jclass activityClass = env->GetObjectClass(obj); 
jfloatArray modelviewArray = env->NewFloatArray(16); 
jmethodID updateMatrixMethod = env->GetMethodID(activityClass, "updateModelviewMatrix", "([F)V"); 

jmethodID fovMethod = env->GetMethodID(activityClass, "setFov", "(F)V"); 
jmethodID fovyMethod = env->GetMethodID(activityClass, "setFovy", "(F)V"); 

// test 
jclass newClass = env->GetObjectClass(obj); 
jmethodID updateCameraMethod = env->GetMethodID(newClass, "updateCamera", "()V"); 

// Clear color and depth buffer 
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// Get the state from QCAR and mark the beginning of a rendering section 
QCAR::State state = QCAR::Renderer::getInstance().begin(); 
// Explicitly render the Video Background 
QCAR::Renderer::getInstance().drawVideoBackground(); 
// Did we find any trackables this frame? 
for(int tIdx = 0; tIdx < state.getNumTrackableResults(); tIdx++) 
{ 
    // Get the trackable: 
    const QCAR::TrackableResult* result = state.getTrackableResult(tIdx); 
    const QCAR::Trackable& trackable = result->getTrackable(); 
    QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(result- >getPose()); 
} 
QCAR::Renderer::getInstance().end(); 


for(int tIdx = 0; tIdx < state.getNumTrackableResults(); tIdx++) 
{ 
// Get the trackable: 
const QCAR::TrackableResult* result = state.getTrackableResult(tIdx); 
const QCAR::Trackable& trackable = result->getTrackable(); 
QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(result- >getPose()); 

    SampleUtils::rotatePoseMatrix(180.0f, 1.0f, 0, 0, &modelViewMatrix.data[0]); 
    // Passes the model view matrix to java 
    env->SetFloatArrayRegion(modelviewArray, 0, 16, modelViewMatrix.data); 
    env->CallVoidMethod(obj, updateMatrixMethod , modelviewArray); 
    env->CallVoidMethod(obj, updateCameraMethod); 
    env->CallVoidMethod(obj, fovMethod, fovRadians); 
    env->CallVoidMethod(obj, fovyMethod, fovyRadians); 




} 
env->DeleteLocalRef(modelviewArray); 



} 

Что означает это исключение?

+0

Какую ошибку вы получаете? –

+0

приложение не работает. Программа компилируется, но приложения останавливаются при ее запуске. – Romain

+0

Можете ли вы что-нибудь увидеть на своем _Logcat_, когда он не сработает? –

ответ

5

Для того, чтобы увидеть что-то перед применением матрицы, вы должны сначала сказать камеру LookAt объект.

Camera cam = world.getCamera(); 
cam.moveCamera(Camera.CAMERA_MOVEOUT, 50); 
cam.lookAt(cube.getTransformedCenter()); 

Помните, что вы должны удалить эти строки при обновлении камеры матрицей вида из маркера.

Если вы следуете моему руководству, вам фактически не нужно активировать какие-либо состояния OpenGL, чтобы что-то увидеть над маркером (хотя вам может быть интересно активировать их, как предложил Сэм Рад по другим причинам).

+0

BTW Я видел, что в учебнике есть несколько ошибок, таких как пропуски этих строк, которые вам сказал Сэм Рад. Я исправлю это как можно скорее. –

+0

Спасибо, у меня есть куб над сценой. Теперь. Но мне не удалось поставить его на маркер. Вы можете увидеть функцию renderframe в «Вопросе», я сделал ошибки в коде? – Romain

+0

Ну, вы должны вызвать метод updateCamera() где-то в вашем коде. Попробуйте поместить его сразу после renderFrame(). –

6

Начало вашего метода renderFrame в ImageTarget.cpp должно быть так:

jclass activityClass = env->GetObjectClass(obj); 
jfloatArray modelviewArray = env->NewFloatArray(16); 
jmethodID method = env->GetMethodID(activityClass, "updateModelviewMatrix", "([F)V"); 

Это, я думаю, собирается решить вашу ошибку для activityClass не был объявлен в этой области

Закомментируйте эту строку и тест снова. Вам это больше не нужно.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

Я также рекомендовал бы закомментировать метод renderFrame() в onDrawFrame(), чтобы увидеть, если jPCT может сделать куб, если QCAR не начал оказание ранее. (только для целей тестирования)

Не говоря уже о том, что QCAR первоначально изменяет состояния OpenGL по умолчанию. Для этого вам нужно включить некоторые из них, чтобы сделать с помощью jPCT. Проверьте OpenGL State Changes in Video Background Renderer для получения дополнительной информации.

Я использую это для OpenGL ES 1.x после того как я называю renderFrame в :

GL11 gl11 = (GL11) gl; 
gl11.glEnable(GL11.GL_DEPTH_TEST); 
gl11.glEnable(GL11.GL_CULL_FACE); 
gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); 
gl11.glEnable(GL11.GL_LIGHTING); 
gl11.glEnable(GL11.GL_BLEND); 
+0

Спасибо, эта ошибка решена. Приложения компилируются, но я не вижу куба на маркере (я не вижу, чтобы чайник больше был нормальным). Как я уже сказал, в первой части учебника перед изменением imagetargets.cpp куб должен появиться по экрану, но он не появился. Возможно, у меня есть одна ошибка в java-коде, но я не вижу, где. – Romain

+0

Я отредактировал вопрос с моим новым кодом в imagetargets и logcat – Romain

+0

ok :) Я прокомментировал строку, но ничего не меняет. – Romain

0

Добавить это рендерер для удаления загруженных текстур

public void cleanup() 
{ 
    TextureManager.getInstance().removeTexture("texture"); 
} 

Вызов это от деятельности при закрытии/паузы

protected void onPause() 
{ 
    mRenderer.cleanup(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^