位置:51电子网 » 技术资料 » 其它综合

JSR184规范封装照相机的lookat方法

发布时间:2008/6/5 0:00:00 访问次数:332

jsr-184与mascot capsule v3主要的不同就是关于照相机的实现。jsr-184支持照相机结合矩阵堆栈处理,例如,我们经常使用transform对象移动照相机。而mascot capsule v3依靠”look-at”方法,这是在某些3d api里的通用方法。look-at方法从一个position,一个 look-at direction和一个up vector创建一个照相机转换矩阵,为了方便mascot capsule v3与jsr-184之间的转换,digital chocolate采纳了mascot capsule v3照相机设计方法,并写了一个支持jsr-184的包。

  在jsr-184 api规范里,nodetransform类指定了一系列方法。这些方法有利于在jsr-184实现look-at方法。然而,它被认为与jsr-184执行说明规范有所不同,有时甚至会忽略这一系列方法。

  自己实现look-at方法其实并不复杂。下面的代码例子是digital chocolate公司如何处理照相机的封装设计。请注意digital chocolate公司在mascot capsule v3中使用整数来处理,而在设计更高层的游戏类设计中使用浮点数来处理。

/**
* wrapper method for setting look at camera.
*
* the method requires that look and up vectors normalized.
*/
public static final void setlookat(float a_posx, float a_posy, float a_posz,
float a_lookx, float a_looky, float a_lookz,
float a_upx, float a_upy, float a_upz)
{
 // jsr-184 version
 if (use_m3g)
 {
  // cross product to get side vector
  float sidex = (a_looky * a_upz) - (a_lookz * a_upy);
  float sidey = (a_lookz * a_upx) - (a_lookx * a_upz);
  float sidez = (a_lookx * a_upy) - (a_looky * a_upx);

  float inv_len = 1.0f / (float) java.lang.math.sqrt(sidex * sidex + sidey * sidey + sidez * sidez);
  sidex *= inv_len;
  sidey *= inv_len;
  sidez *= inv_len;

  // make up vector perpendicular
  a_upx = (sidey * a_lookz) - (sidez * a_looky);
  a_upy = (sidez * a_lookx) - (sidex * a_lookz);
  a_upz = (sidex * a_looky) - (sidey * a_lookx);
  // footnote: up is unit size because side and look are perpendicular

  sm_mtx[0] = sidex;
  sm_mtx[1] = a_upx;
  sm_mtx[2] = -a_lookx;
  sm_mtx[3] = a_posx;
  sm_mtx[4] = sidey;
  sm_mtx[5] = a_upy;
  sm_mtx[6] = -a_looky;
  sm_mtx[7] = a_posy;
  sm_mtx[8] = sidez;
  sm_mtx[9] = a_upz;
  sm_mtx[10] = -a_lookz;
  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;

  sm_m3gtransform.set(sm_mtx);
 }
 // mascot version
 if (use_mascot)
 {
  sm_mascottmpvectora.set((int)a_posx, (int)a_posy, (int)a_posz);
  sm_mascottmpvectorb.set((int)(a_lookx * mascot_one),(int)(a_looky * mascot_one),(int)(a_lookz * mascot_one));
  sm_mascottmpvectorc.set(0, dajmgraphics.mascot_one, 0);
  sm_mascotaffinetrans.lookat(sm_mascottmpvectora, sm_mascottmpvectorb,sm_mascottmpvectorc);
 }
}


jsr-184与mascot capsule v3主要的不同就是关于照相机的实现。jsr-184支持照相机结合矩阵堆栈处理,例如,我们经常使用transform对象移动照相机。而mascot capsule v3依靠”look-at”方法,这是在某些3d api里的通用方法。look-at方法从一个position,一个 look-at direction和一个up vector创建一个照相机转换矩阵,为了方便mascot capsule v3与jsr-184之间的转换,digital chocolate采纳了mascot capsule v3照相机设计方法,并写了一个支持jsr-184的包。

  在jsr-184 api规范里,nodetransform类指定了一系列方法。这些方法有利于在jsr-184实现look-at方法。然而,它被认为与jsr-184执行说明规范有所不同,有时甚至会忽略这一系列方法。

  自己实现look-at方法其实并不复杂。下面的代码例子是digital chocolate公司如何处理照相机的封装设计。请注意digital chocolate公司在mascot capsule v3中使用整数来处理,而在设计更高层的游戏类设计中使用浮点数来处理。

/**
* wrapper method for setting look at camera.
*
* the method requires that look and up vectors normalized.
*/
public static final void setlookat(float a_posx, float a_posy, float a_posz,
float a_lookx, float a_looky, float a_lookz,
float a_u, float a_upy, float a_upz)
{
 // jsr-184 version
 if (use_m3g)
 {
  // cross product to get side vector
  float sidex = (a_looky * a_upz) - (a_lookz * a_upy);
  float sidey = (a_lookz * a_u) - (a_lookx * a_upz);
  float sidez = (a_lookx * a_upy) - (a_looky * a_u);

  float inv_len = 1.0f / (float) java.lang.math.sqrt(sidex * sidex + sidey * sidey + sidez * sidez);
  sidex *= inv_len;
  sidey *= inv_len;
  sidez *= inv_len;

  // make up vector perpendicular
  a_u = (sidey * a_lookz) - (sidez * a_looky);
  a_upy = (sidez * a_lookx) - (sidex * a_lookz);
  a_upz = (sidex * a_looky) - (sidey * a_lookx);
  // footnote: up is unit size because side and look are perpendicular

  sm_mtx[0] = sidex;
  sm_mtx[1] = a_u;
  sm_mtx[2] = -a_lookx;
  sm_mtx[3] = a_posx;
  sm_mtx[4] = sidey;
  sm_mtx[5] = a_upy;
  sm_mtx[6] = -a_looky;
  sm_mtx[7] = a_posy;
  sm_mtx[8] = sidez;
  sm_mtx[9] = a_upz;
  sm_mtx[10] = -a_lookz;
  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;

  sm_m3gtransform.set(sm_mtx);
 }
 // mascot version
 if (use_mascot)
 {
  sm_mascottmpvectora.set((int)a_posx, (int)a_posy, (int)a_posz);
  sm_mascottmpvectorb.set((int)(a_lookx * mascot_one),(int)(a_looky * mascot_one),(int)(a_lookz * mascot_one));
  sm_mascottmpvectorc.set(0, dajmgraphics.mascot_one, 0);
  sm_mascotaffinetrans.lookat(sm_mascottmpvectora, sm_mascottmpvectorb,sm_mascottmpvectorc);
 }
}


相关IC型号

热门点击

 

推荐技术资料

罗盘误差及补偿
    造成罗盘误差的主要因素有传感器误差、其他磁材料干扰等。... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!