--- /dev/null
+/**\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