使用 jpct-ae 引擎更改简单的 ARToolkit android 应用程序以显示 3d 模型
我想在 Hiro 标记上显示 3d 模型。我下载了简单的 ARToolkit 应用程序并添加了 jpct-ae 引擎作为依赖项。然后将应用程序中的 SimpleRenderer.java 更改为以下代码。我尝试了以下代码。当我只将“立方体”添加到世界时,它工作得很好,但是当我将“坦克”添加到世界时,它不会在标记上显示任何内容。我觉得我错过了什么。
package org.artoolkit.ar.samples.ARSimple;
import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import com.threed.jpct.Camera;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.Light;
import com.threed.jpct.Loader;
import com.threed.jpct.Matrix;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.Texture;
import com.threed.jpct.TextureManager;
import com.threed.jpct.World;
import com.threed.jpct.util.BitmapHelper;
import javax.microedition.khronos.opengles.GL10;
import org.artoolkit.ar.base.ARToolKit;
import org.artoolkit.ar.base.rendering.ARRenderer;
import org.artoolkit.ar.base.rendering.Cube;
import org.artoolkit.ar.samples.R;
import java.io.IOException;
/**
* A very simple Renderer that adds a marker and draws a cube on it.
*/
public class SimpleRenderer extends ARRenderer {
private int markerId1 = -1;
private float angle = 0.0f;
private boolean spinning = false;
Matrix projMatrix=new Matrix(); //the matrix having the camera projection
Matrix markerMatrix=new Matrix(); //the matrix having the transformation to place the tank in the marker
Matrix modelMatrix=new Matrix(); //the matrix having the model (tank) rotation and translation
private boolean markerVisible;
private Camera camera;
private World world;
private Object3D tank;
private Object3D cube;
private float movementX;
private float movementY;
private FrameBuffer frameBuffer;
private Cube cube2 = new Cube(40.0f, 0.0f, 0.0f, 20.0f);
@Override
public boolean configureARScene() {
configureJPCTWorld();
markerId1 = ARToolKit.getInstance().addMarker("single;Data/patt.hiro;80");
if (markerId1 < 0) return false;
return true;
}
public void click() {
spinning = !spinning;
}
@Override
public void onSurfaceChanged(GL10 unused, int w, int h) {
super.onSurfaceChanged(unused, w, h);
if(frameBuffer!=null){
frameBuffer.dispose();
}
frameBuffer=new FrameBuffer(unused,w,h);
}
public void configureJPCTWorld(){
world=new World();
world.setAmbientLight(20, 20, 20);
Light sun=new Light(world);
sun.setIntensity(250, 250, 250);
camera=world.getCamera();
Texture cubeText=
new Texture(
BitmapHelper.rescale(
BitmapHelper.convert(
ARSimpleApplication.context.
getResources().
getDrawable(R.drawable.crate_1)
),128,128
)
);
TextureManager.getInstance().addTexture("Crate_1",cubeText);
cube = Primitives.getCube(40);
cube.calcTextureWrapSpherical();
cube.setTexture("Crate_1");
cube.strip();
cube.build();
try {
AssetManager assetManager =
ARSimpleApplication.context.getAssets();
Object3D[] objects =
Loader.load3DS(assetManager.open("Crate1.3ds"), 0.1f);
tank= Object3D.mergeAll(objects);
tank.setTexture("Crate_1");
tank.strip();
tank.build();
}catch(IOException e){
Log.e("RENDERER-JPCT","Error loading tank",e);
}
//MemoryHelper.compact();
}
@Override
public void draw(GL10 gl) {
world.removeAllObjects();
markerVisible=false;
float[] projectionCamera=ARToolKit.getInstance().getProjectionMatrix();
projMatrix.setIdentity();
projMatrix.setDump(projectionCamera);
projMatrix.transformToGL();
SimpleVector translation=projMatrix.getTranslation();
SimpleVector dir=projMatrix.getZAxis();
SimpleVector up=projMatrix.getYAxis();
camera.setPosition(translation);
camera.setOrientation(dir, up);
if(ARToolKit.getInstance().queryMarkerVisible(markerId1)){
//Matrix markerMatrix=new Matrix();
markerMatrix.setIdentity();
//Log.e("RENDERER", "Marker1 detected");
float[] marker1Transformation=
ARToolKit.
getInstance().
queryMarkerTransformation(markerId1);
markerMatrix.setDump(marker1Transformation);
markerMatrix.transformToGL();
//cube.clearTranslation();
//cube.clearRotation();
cube.setRotationMatrix(markerMatrix);
cube.setTranslationMatrix(markerMatrix);
world.addObject(cube);// This works fine
world.addObject(tank); // This is not displayed
}
frameBuffer.clear();
world.renderScene(frameBuffer);
world.draw(frameBuffer);
frameBuffer.display();
//if(markerVisible)updateMovement(4,2);
}
}