OSDN Git Service

初期インポート。
[nyartoolkit-and/nyartoolkit-android-0.9.git] / src / jp / nyatla / nyartoolkit / jogl / utils / GLNyARParam.java
diff --git a/src/jp/nyatla/nyartoolkit/jogl/utils/GLNyARParam.java b/src/jp/nyatla/nyartoolkit/jogl/utils/GLNyARParam.java
new file mode 100644 (file)
index 0000000..dddc7b2
--- /dev/null
@@ -0,0 +1,117 @@
+/**\r
+ * NyARParamにOpenGL向け関数を追加したもの\r
+ * (c)2008 A虎@nyatla.jp\r
+ * airmail(at)ebony.plala.or.jp\r
+ * http://nyatla.jp/\r
+ */\r
+package jp.nyatla.nyartoolkit.jogl.utils;\r
+\r
+import jp.nyatla.nyartoolkit.core.NyARMat;\r
+import jp.nyatla.nyartoolkit.core.NyARParam;\r
+\r
+public class GLNyARParam extends NyARParam {\r
+       private double view_distance_min = 0.1;// #define VIEW_DISTANCE_MIN 0.1 //\r
+       // Objects closer to the camera than\r
+       // this will not be displayed.\r
+       private double view_distance_max = 100.0;// #define VIEW_DISTANCE_MAX\r
+       // 100.0 // Objects further away\r
+       // from the camera than this\r
+       // will not be displayed.\r
+       private double[] m_projection = null;\r
+\r
+       private float[] m_projectionF = null;\r
+\r
+       public void setViewDistanceMin(double i_new_value) {\r
+               m_projection = null;// キャッシュ済変数初期化\r
+               view_distance_min = i_new_value;\r
+       }\r
+\r
+       public void setViewDistanceMax(double i_new_value) {\r
+               m_projection = null;// キャッシュ済変数初期化\r
+               view_distance_max = i_new_value;\r
+       }\r
+\r
+       /**\r
+        * void arglCameraFrustumRH(const ARParam *cparam, const double focalmin,\r
+        * const double focalmax, GLdouble m_projection[16]) 関数の置き換え\r
+        * \r
+        * @param focalmin\r
+        * @param focalmax\r
+        * @return\r
+        */\r
+       public double[] getCameraFrustumRH() {\r
+               // 既に値がキャッシュされていたらそれを使う\r
+               if (m_projection != null) {\r
+                       return m_projection;\r
+               }\r
+               // 無ければ計算\r
+               m_projection = new double[16];\r
+               NyARMat trans_mat = new NyARMat(3, 4);\r
+               NyARMat icpara_mat = new NyARMat(3, 4);\r
+               double[][] p = new double[3][3], q = new double[4][4];\r
+               int width, height;\r
+               int i, j;\r
+\r
+               width = xsize;\r
+               height = ysize;\r
+\r
+               decompMat(icpara_mat, trans_mat);\r
+\r
+               double[][] icpara = icpara_mat.getArray();\r
+               double[][] trans = trans_mat.getArray();\r
+               for (i = 0; i < 4; i++) {\r
+                       icpara[1][i] = (height - 1) * (icpara[2][i]) - icpara[1][i];\r
+               }\r
+\r
+               for (i = 0; i < 3; i++) {\r
+                       for (j = 0; j < 3; j++) {\r
+                               p[i][j] = icpara[i][j] / icpara[2][2];\r
+                       }\r
+               }\r
+               q[0][0] = (2.0 * p[0][0] / (width - 1));\r
+               q[0][1] = (2.0 * p[0][1] / (width - 1));\r
+               q[0][2] = -((2.0 * p[0][2] / (width - 1)) - 1.0);\r
+               q[0][3] = 0.0;\r
+\r
+               q[1][0] = 0.0;\r
+               q[1][1] = -(2.0 * p[1][1] / (height - 1));\r
+               q[1][2] = -((2.0 * p[1][2] / (height - 1)) - 1.0);\r
+               q[1][3] = 0.0;\r
+\r
+               q[2][0] = 0.0;\r
+               q[2][1] = 0.0;\r
+               q[2][2] = (view_distance_max + view_distance_min)\r
+                               / (view_distance_min - view_distance_max);\r
+               q[2][3] = 2.0 * view_distance_max * view_distance_min\r
+                               / (view_distance_min - view_distance_max);\r
+\r
+               q[3][0] = 0.0;\r
+               q[3][1] = 0.0;\r
+               q[3][2] = -1.0;\r
+               q[3][3] = 0.0;\r
+\r
+               for (i = 0; i < 4; i++) { // Row.\r
+                       // First 3 columns of the current row.\r
+                       for (j = 0; j < 3; j++) { // Column.\r
+                               m_projection[i + j * 4] = q[i][0] * trans[0][j] + q[i][1]\r
+                                               * trans[1][j] + q[i][2] * trans[2][j];\r
+                       }\r
+                       // Fourth column of the current row.\r
+                       m_projection[i + 3 * 4] = q[i][0] * trans[0][3] + q[i][1]\r
+                                       * trans[1][3] + q[i][2] * trans[2][3] + q[i][3];\r
+               }\r
+               return m_projection;\r
+       }\r
+\r
+       public float[] getCameraFrustumRHf() {\r
+               // 既に値がキャッシュされていたらそれを使う\r
+               if (m_projectionF == null) {\r
+                       double[] mf = getCameraFrustumRH();\r
+                       m_projectionF = new float[mf.length];\r
+                       for (int i = 0; i < mf.length; i++) {\r
+                               m_projectionF[i] = (float) mf[i];\r
+                       }\r
+               }\r
+               return m_projectionF;\r
+       }\r
+}\r