终于实现Object lookAt Object了。。

丫丫呸。。。搞了大半天。。。唉,基础知识还是不牢固啊。。
初始化:
     man0 
= loadTerrist();
     man0.scale(
0.5f0.5f0.5f);
     world.addChild(man0);
     man1 
= (Group)man0.duplicate();
     
     man1 
= loadTerrist();
     man1.scale(
0.5f0.5f0.5f);
        
     world.addChild (man1);
 
第一种效果:
man1 绕着 man0 转,man0静止不动, 但man1并不是时刻朝向man0;
        translateMan1.setIdentity ();
        translateMan1.postTranslate (radious, 
0.0f0.0f);
        rotateMan1.setIdentity ();
        rotateMan1.postRotate (angleY_Man1, 
0.0f1.0f0.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.0f0.0f);
        rotateMan1.setIdentity ();
        rotateMan1.postRotate (angleY_Man1, 
0.0f1.0f0.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], 010, 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);
    }

 
第三种:准备找到一个数学方法,通过矩阵运算,来达到效果。。
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值