丫丫呸。。。搞了大半天。。。唉,基础知识还是不牢固啊。。
初始化:
man0 = loadTerrist();
man0.scale(0.5f, 0.5f, 0.5f);
world.addChild(man0);
man1 = (Group)man0.duplicate();
man1 = loadTerrist();
man1.scale(0.5f, 0.5f, 0.5f);
world.addChild (man1);
第一种效果:
man1 绕着 man0 转,man0静止不动, 但man1并不是时刻朝向man0;
translateMan1.setIdentity ();
translateMan1.postTranslate (radious, 0.0f, 0.0f);
rotateMan1.setIdentity ();
rotateMan1.postRotate (angleY_Man1, 0.0f, 1.0f, 0.0f);
angleY_Man1 += 5.0f;
if(angleY_Man1 >= 360.0f) ...{
angleY_Man1 -= 360.0f;
}
resultMan1.setIdentity ();
resultMan1.postMultiply (rotateMan1);
resultMan1.postMultiply (translateMan1);
man1.setTransform (resultMan1);
这就可以实现了
第二种:在第一种的基础上,实现man1绕着man0的同时,man1时刻朝向man0
这里用到了我修改过的SE网站上的lookAt方法
translateMan1.setIdentity ();
translateMan1.postTranslate (radious, 0.0f, 0.0f);
rotateMan1.setIdentity ();
rotateMan1.postRotate (angleY_Man1, 0.0f, 1.0f, 0.0f);
angleY_Man1 += 5.0f;
if(angleY_Man1 >= 360.0f) ...{
angleY_Man1 -= 360.0f;
}
resultMan1.setIdentity ();
resultMan1.postMultiply (rotateMan1);
resultMan1.postMultiply (translateMan1);
man1.setTransform (resultMan1);
float[] posMan0 = new float[3];
float[] posMan1 = new float[3];
Transform tTemp = new Transform();
man1.getTransform(tTemp);
man0.getTranslation(posMan0);
man1.getTranslation(posMan1);
float[] matrix = new float[16];
tTemp.get(matrix);
posMan1[0] = matrix[3];
posMan1[1] = matrix[7];
posMan1[2] = matrix[11];
lookAt(posMan0[0], posMan0[1], posMan0[2], posMan1[0], posMan1[1], posMan1[2], 0, 1, 0, tTemp);
man1.setTransform(tTemp);
man1.getTranslation(posMan0);
man1.translate(-posMan0[0], -posMan0[1], -posMan0[2]);
man1.translate(posMan1[0], posMan1[1], posMan1[2]);

/** *//**
*
* To set the camera look-at the object
* The same as gluLookAt
* @param a_posX The object's X Position
* @param a_posY The object's Y Position
* @param a_posZ The object's Z Position
* @param a_camX The camera's X Position
* @param a_camY The camera's Y Position
* @param a_camZ The camera's Z Position
* @param a_upX The upper X Position
* @param a_upY The upper Y direction
* @param a_upZ The upper Z direction
* @param trans The camera's transform
*/
public void lookAt (float a_posX, float a_posY, float a_posZ, float a_camX, float a_camY, float a_camZ,
float a_upX, float a_upY, float a_upZ, Transform trans) ...{
float[] look = new float[3];
look[0] = a_camX - a_posX;
look[1] = a_camY - a_posY;
look[2] = a_camZ - a_posZ;
float len = (float)Math.sqrt (look[0]*look[0] + look[1]*look[1] + look[2]*look[2]);
if(len != 0) ...{
len = 1/len;
}
look[0] *= len;
look[1] *= len;
look[2] *= len;
//cross prodect to get the side vector
float sideX = look[1]*a_upZ - look[2]*a_upY;
float sideY = look[2]*a_upX - look[0]*a_upZ;
float sideZ = look[0]*a_upY - look[1]*a_upX;
float[] sm_mtx = new float[16];
len = (float) Math.sqrt (sideX*sideX + sideY*sideY + sideZ*sideZ);
if(len != 0) ...{
len = 1/len;
}
sideX *= len;
sideY *= len;
sideZ *= len;
//make up vector perpendicular正交
//一般地,a_upX = 0, a_upY = 1, a_upZ = 0, 所以无需单位话,否则,计算完毕后还要进行单位化处理
a_upX = sideY*look[2] - sideZ*look[1];
a_upY = sideZ*look[0] - sideX*look[2];
a_upZ = sideX*look[1] - sideY*look[0];
sm_mtx[0] = sideX;
sm_mtx[1] = a_upX;
sm_mtx[2] = -look[0];
sm_mtx[3] = a_posX;
sm_mtx[4] = sideY;
sm_mtx[5] = a_upY;
sm_mtx[6] = -look[1];
sm_mtx[7] = a_posY;
sm_mtx[8] = sideZ;
sm_mtx[9] = a_upZ;
sm_mtx[10] = -look[2];
sm_mtx[11] = a_posZ;
sm_mtx[12] = 0.0f;
sm_mtx[13] = 0.0f;
sm_mtx[14] = 0.0f;
sm_mtx[15] = 1.0f;
trans.set (sm_mtx);
}
第三种:准备找到一个数学方法,通过矩阵运算,来达到效果。。
1812

被折叠的 条评论
为什么被折叠?



