我想在房间的某处放置一个立方体。立方体在房间内是静态的,并且始终处于同一点。目前我可以在房间里放置一个立方体,但如果我移动Tango平板电脑,它与立方体的运动不同步,我不知道如何同步我的Tango平板电脑运动和物体运动。
我的想法是,如果我将Tango平板电脑向右移动,我的Cube向左移动的速度与我的Tango平板电脑向右移动的速度相同。我尝试了所有方向,但正如之前说的那样,并没有非常同步。
我遇到的另一个问题是,如果我将相机指向另一个方向且设备处于相同位置,立方体怎么能保持静止?
说实话,我上周开始使用OpenGL,我不知道它的所有功能,或者我是否以正确的方式进行操作。
我希望你理解我的问题,并能给我一些提示。
以下是我认为对我要做的事情很重要的代码:
GLSurfaceView渲染器类:
@Override
public void onDrawFrame(GL10 gl) {
//gl.glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
gl.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL11.GL_MODELVIEW);
gl.glLoadIdentity();
Quaternion q = new Quaternion(xr,yr,zr,wr);
Vector3f vr = q.getEulerAngles();
gl.glTranslatef(x, y, z);
//gl.glTranslatef(0.0f, 0.0f, 0.0f);
gl.glRotatef(vr.x, 1.0f, 0.0f, 0.0f);
gl.glRotatef(vr.y, 0.0f, 1.0f, 0.0f);
gl.glRotatef(vr.z, 0.0f, 0.0f, z);
gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL11.GL_COLOR_ARRAY);
mSquare.draw(gl);
}
以下是MainActivity的代码:
private void startCameraPreview() {
// Connect to color camera
tangoCameraPreview.connectToTangoCamera(mTango,
TangoCameraIntrinsics.TANGO_CAMERA_COLOR);
final ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>();
framePairs.add(new TangoCoordinateFramePair(
TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
TangoPoseData.COORDINATE_FRAME_DEVICE));
mTango.connectListener(framePairs, new Tango.OnTangoUpdateListener() {
@Override
public void onPoseAvailable(TangoPoseData pose) {
// We are not using OnPoseAvailable for this app
tangoRenderer.getModelMatCalculator().updateModelMatrix(pose.getTranslationAsFloats(),pose.getRotationAsFloats());
transolationData = pose.getTranslationAsFloats();
data = tangoRenderer.getModelMatCalculator().getTranslation();
//transolationData = tangoRenderer.getModelMatCalculator().getTranslation();
Quaternion q = new Quaternion((float)pose.rotation[0],(float)pose.rotation[1],(float)pose.rotation[2],(float)pose.rotation[3]);
final Vector3f vr = q.getEulerAngles();
runOnUiThread(new Runnable() {
@Override
public void run() {
if (transolationData != null) {
pose_text_view.setText("BU X: " + Math.round(transolationData[0] * 100f) / 100f + " Z: " + Math.round(transolationData[1] * 100f) / 100f + " Y: " + Math.round(transolationData[2] * 100f) / 100f + " length from transolationData: " + transolationData.length + "\n");
pose_text_winkel.setText("Winkel X: " + decimalFormat.format((vr.x*100)/100) + " Y: " + decimalFormat.format((vr.y*100)/100) + " Z: " + decimalFormat.format((vr.z*100)/100) + "\n"
+ "Device Daten X: " + decimalFormat.format(data[0]) + " Y: " + decimalFormat.format(data[1]) + " Z: " + decimalFormat.format(data[2]));
// + " CameraView X: " + tangoCameraPreview.getTranslationX() + " Y: " + tangoCameraPreview.getTranslationY() + " Z: " + tangoCameraPreview.getTranslationZ());
}
}
});
if(isCubeSet){
/* neuX = (data[0]+x);
neuY = (data[1]+y);
neuZ = -(data[2]+z);*/
neuX = (transolationData[0]+x);
neuY = (transolationData[2]+y);
neuZ = -(data[2]+z);
rendererCube.setX(neuX);
rendererCube.setY(neuY);
rendererCube.setZ(neuZ);
rendererCube.setXr((float) pose.rotation[0]);
rendererCube.setYr((float) pose.rotation[1]);
rendererCube.setZr((float) pose.rotation[2]);
rendererCube.setWr((float) pose.rotation[3]);
}
}
这里我用起点设置我的立方体:
@Override
public boolean onTouch(View v, MotionEvent event) {
if(!isCubeSet){
if(event.getAction() == MotionEvent.ACTION_UP) {
x = data[0];
y = data[1];
z = -data[2];
neuX = x;
neuY = y;
neuZ = z;
rendererCube.setX(x);
rendererCube.setY(y);
rendererCube.setZ(z);
isCubeSet = true;
return true;
}
}else{
if(event.getAction() == MotionEvent.ACTION_UP) {
isCubeSet = false;
}
}
return true;
}