OSDN Git Service

416d1be678d8b56408085cca933294506f26f695
[nyartoolkit-and/nyartoolkit-and.git] / src.utils / jogl / jp / nyatla / nyartoolkit / jogl / utils / GLNyARParam.java
1 /* \r
2  * PROJECT: NyARToolkit JOGL utilities.\r
3  * --------------------------------------------------------------------------------\r
4  * This work is based on the original ARToolKit developed by\r
5  *   Hirokazu Kato\r
6  *   Mark Billinghurst\r
7  *   HITLab, University of Washington, Seattle\r
8  * http://www.hitl.washington.edu/artoolkit/\r
9  *\r
10  * The NyARToolkit is Java version ARToolkit class library.\r
11  * Copyright (C)2008 R.Iizuka\r
12  *\r
13  * This program is free software; you can redistribute it and/or\r
14  * modify it under the terms of the GNU General Public License\r
15  * as published by the Free Software Foundation; either version 2\r
16  * of the License, or (at your option) any later version.\r
17  * \r
18  * This program is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21  * GNU General Public License for more details.\r
22  * \r
23  * You should have received a copy of the GNU General Public License\r
24  * along with this framework; if not, write to the Free Software\r
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
26  * \r
27  * For further information please contact.\r
28  *      http://nyatla.jp/nyatoolkit/\r
29  *      <airmail(at)ebony.plala.or.jp>\r
30  * \r
31  */\r
32 package jp.nyatla.nyartoolkit.jogl.utils;\r
33 \r
34 import jp.nyatla.nyartoolkit.core.*;\r
35 import jp.nyatla.nyartoolkit.core.param.NyARParam;\r
36 \r
37 /**\r
38  * NyARParamにOpenGL向け関数を追加したもの\r
39  */\r
40 public class GLNyARParam extends NyARParam\r
41 {\r
42         private double view_distance_min = 0.1;//#define VIEW_DISTANCE_MIN              0.1                     // Objects closer to the camera than this will not be displayed.\r
43 \r
44         private double view_distance_max = 100.0;//#define VIEW_DISTANCE_MAX            100.0           // Objects further away from the camera than this will not be displayed.\r
45 \r
46         private double[] m_projection = null;\r
47 \r
48         public void setViewDistanceMin(double i_new_value)\r
49         {\r
50                 m_projection = null;//キャッシュ済変数初期化\r
51                 view_distance_min = i_new_value;\r
52         }\r
53 \r
54         public void setViewDistanceMax(double i_new_value)\r
55         {\r
56                 m_projection = null;//キャッシュ済変数初期化\r
57                 view_distance_max = i_new_value;\r
58         }\r
59 \r
60         /**\r
61          * void arglCameraFrustumRH(const ARParam *cparam, const double focalmin, const double focalmax, GLdouble m_projection[16])\r
62          * 関数の置き換え\r
63          * @param focalmin\r
64          * @param focalmax\r
65          * @return\r
66          */\r
67         public double[] getCameraFrustumRH()\r
68         {\r
69                 //既に値がキャッシュされていたらそれを使う\r
70                 if (m_projection != null) {\r
71                         return m_projection;\r
72                 }\r
73                 //無ければ計算\r
74                 m_projection = new double[16];\r
75                 NyARMat trans_mat = new NyARMat(3, 4);\r
76                 NyARMat icpara_mat = new NyARMat(3, 4);\r
77                 double[][] p = new double[3][3], q = new double[4][4];\r
78 \r
79                 int i, j;\r
80 \r
81                 final int width = this._screen_size.w;\r
82                 final int height = this._screen_size.h;\r
83 \r
84                 this.getPerspectiveProjectionMatrix().decompMat(icpara_mat, trans_mat);\r
85 \r
86                 double[][] icpara = icpara_mat.getArray();\r
87                 double[][] trans = trans_mat.getArray();\r
88                 for (i = 0; i < 4; i++) {\r
89                         icpara[1][i] = (height - 1) * (icpara[2][i]) - icpara[1][i];\r
90                 }\r
91 \r
92                 for (i = 0; i < 3; i++) {\r
93                         for (j = 0; j < 3; j++) {\r
94                                 p[i][j] = icpara[i][j] / icpara[2][2];\r
95                         }\r
96                 }\r
97                 q[0][0] = (2.0 * p[0][0] / (width - 1));\r
98                 q[0][1] = (2.0 * p[0][1] / (width - 1));\r
99                 q[0][2] = -((2.0 * p[0][2] / (width - 1)) - 1.0);\r
100                 q[0][3] = 0.0;\r
101 \r
102                 q[1][0] = 0.0;\r
103                 q[1][1] = -(2.0 * p[1][1] / (height - 1));\r
104                 q[1][2] = -((2.0 * p[1][2] / (height - 1)) - 1.0);\r
105                 q[1][3] = 0.0;\r
106 \r
107                 q[2][0] = 0.0;\r
108                 q[2][1] = 0.0;\r
109                 q[2][2] = (view_distance_max + view_distance_min) / (view_distance_min - view_distance_max);\r
110                 q[2][3] = 2.0 * view_distance_max * view_distance_min / (view_distance_min - view_distance_max);\r
111 \r
112                 q[3][0] = 0.0;\r
113                 q[3][1] = 0.0;\r
114                 q[3][2] = -1.0;\r
115                 q[3][3] = 0.0;\r
116 \r
117                 for (i = 0; i < 4; i++) { // Row.\r
118                         // First 3 columns of the current row.\r
119                         for (j = 0; j < 3; j++) { // Column.\r
120                                 m_projection[i + j * 4] = q[i][0] * trans[0][j] + q[i][1] * trans[1][j] + q[i][2] * trans[2][j];\r
121                         }\r
122                         // Fourth column of the current row.\r
123                         m_projection[i + 3 * 4] = q[i][0] * trans[0][3] + q[i][1] * trans[1][3] + q[i][2] * trans[2][3] + q[i][3];\r
124                 }\r
125                 return m_projection;\r
126         }\r
127 }\r