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中使用整数来处理,而在设计更高层的游戏类设计中使用浮点数来处理。
在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中使用整数来处理,而在设计更高层的游戏类设计中使用浮点数来处理。
在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); } } |