質問編集履歴

1

ko-dotuika

2016/09/29 00:29

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -80,4 +80,484 @@
80
80
 
81
81
  javaファイル
82
82
 
83
+ ```import java.nio.ByteBuffer;
84
+
85
+ import java.nio.ByteOrder;
86
+
87
+ import java.nio.FloatBuffer;
88
+
89
+ import java.util.List;
90
+
91
+
92
+
93
+ import javax.microedition.khronos.egl.EGLConfig;
94
+
95
+ import javax.microedition.khronos.opengles.GL10;
96
+
97
+
98
+
99
+ import android.hardware.Sensor;
100
+
101
+ import android.hardware.SensorEvent;
102
+
103
+ import android.hardware.SensorEventListener;
104
+
105
+ import android.hardware.SensorManager;
106
+
107
+ import android.opengl.GLSurfaceView;
108
+
109
+ import android.opengl.GLU;
110
+
111
+ import android.opengl.GLSurfaceView.Renderer;
112
+
113
+ import android.os.Bundle;
114
+
115
+ import android.app.Activity;
116
+
117
+ import android.content.Context;
118
+
119
+ import android.content.pm.ActivityInfo;
120
+
121
+ import android.util.Log;
122
+
123
+ import android.widget.Toast;
124
+
125
+
126
+
127
+ public class MainActivity extends Activity {
128
+
129
+ private MainSurface surface = null;
130
+
131
+
132
+
133
+ @Override
134
+
135
+ protected void onCreate(Bundle savedInstanceState) {
136
+
137
+ super.onCreate(savedInstanceState);
138
+
139
+
140
+
141
+ //画面の向きを縦に固定
142
+
143
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
144
+
145
+
146
+
147
+ surface = new MainSurface(getApplicationContext());
148
+
149
+ surface.setRenderer(surface);
150
+
151
+ surface.setFocusable(true);
152
+
153
+ surface.setKeepScreenOn(true);
154
+
155
+ setContentView(surface);
156
+
157
+ }
158
+
159
+
160
+
161
+ @Override
162
+
163
+ protected void onResume() {
164
+
165
+ super.onResume();
166
+
167
+ surface.onResume();
168
+
169
+ }
170
+
171
+
172
+
173
+ @Override
174
+
175
+ protected void onPause() {
176
+
177
+ super.onPause();
178
+
179
+ surface.onPause();
180
+
181
+ }
182
+
183
+
184
+
185
+ private class MainSurface extends GLSurfaceView implements Renderer, SensorEventListener {
186
+
187
+ //センサー
188
+
189
+ private SensorManager sensorManager = null;
190
+
191
+ //センサーのフラグ
192
+
193
+ private boolean sensorMRegisted = false;
194
+
195
+ private boolean sensorARegisted = false;
196
+
197
+
198
+
199
+ //回転行列
200
+
201
+ private static final int MATRIX_SIZE = 16;
202
+
203
+ float[] inR = new float[MATRIX_SIZE];
204
+
205
+ float[] outR = new float[MATRIX_SIZE];
206
+
207
+ float[] I = new float[MATRIX_SIZE];
208
+
209
+
210
+
211
+ //センサーの値保持
212
+
213
+ private float[] orientationValues = new float[3];
214
+
215
+ private float[] magneticValues = new float[3];
216
+
217
+ private float[] accelerometerValues = new float[3];
218
+
219
+
220
+
221
+ //傾きの角度
222
+
223
+ private int[] orientDgrees = new int[3];
224
+
225
+
226
+
227
+ //ポリゴン
228
+
229
+ private float box[] = new float[] {
230
+
231
+ //前面
232
+
233
+ -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
234
+
235
+ //背面
236
+
237
+ -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f,
238
+
239
+ //左面
240
+
241
+ -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f,
242
+
243
+ //右面
244
+
245
+ 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
246
+
247
+ //上面
248
+
249
+ -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f,
250
+
251
+ //下面
252
+
253
+ -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f,
254
+
255
+ };
256
+
257
+
258
+
83
- > http://blog.fujiu.jp/2013/08/android_24.html
259
+ private FloatBuffer cubeBuff; //頂点座標バッファ
260
+
261
+
262
+
263
+ public MainSurface(Context context) {
264
+
265
+ super(context);
266
+
267
+ Log.d(MainSurface.class.getName(), "constractor");
268
+
269
+
270
+
271
+ //バッファの生成
272
+
273
+ cubeBuff = makeFloatBuffer(box);
274
+
275
+ }
276
+
277
+
278
+
279
+ @Override
280
+
281
+ public void onSurfaceCreated(GL10 gl, EGLConfig config) {
282
+
283
+ Log.d(MainSurface.class.getName(), "onSurfaceCreated");
284
+
285
+ }
286
+
287
+
288
+
289
+ @Override
290
+
291
+ public void onDrawFrame(GL10 gl) {
292
+
293
+ //背面塗り潰し
294
+
295
+ gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
296
+
297
+
298
+
299
+ //モデルビュー行列の指定
300
+
301
+ gl.glMatrixMode(GL10.GL_MODELVIEW);
302
+
303
+ gl.glLoadIdentity();
304
+
305
+ GLU.gluLookAt(gl, 0, 0, 3, 0, 0, 0, 0, 1, 0);
306
+
307
+
308
+
309
+ //頂点配列の指定
310
+
311
+ gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeBuff);
312
+
313
+ gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
314
+
315
+
316
+
317
+ gl.glPushMatrix();
318
+
319
+
320
+
321
+ gl.glRotatef(orientDgrees[1], -1.0f, 0.0f, 0.0f);
322
+
323
+ gl.glRotatef(orientDgrees[2], 0.0f, -1.0f, 0.0f);
324
+
325
+ gl.glRotatef(orientDgrees[0], 0.0f, 0.0f, -1.0f);
326
+
327
+
328
+
329
+ //前面と背面のプリミティブの描画
330
+
331
+ gl.glColor4f(1.0f, 0, 0, 1.0f);
332
+
333
+ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
334
+
335
+ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);
336
+
337
+
338
+
339
+ //左面と右面のプリミティブの描画
340
+
341
+ gl.glColor4f(0, 1.0f, 0, 1.0f);
342
+
343
+ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);
344
+
345
+ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);
346
+
347
+
348
+
349
+ //上面と下面のプリミティブの描画
350
+
351
+ gl.glColor4f(0, 0, 1.0f, 1.0f);
352
+
353
+ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);
354
+
355
+ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);
356
+
357
+
358
+
359
+ gl.glPopMatrix();
360
+
361
+ }
362
+
363
+
364
+
365
+ @Override
366
+
367
+ public void onSurfaceChanged(GL10 gl, int width, int height) {
368
+
369
+ // ここから四角形を表示?
370
+
371
+ gl.glMatrixMode(GL10.GL_PROJECTION);
372
+
373
+ gl.glLoadIdentity();
374
+
375
+ gl.glViewport(0, 0, width, height);
376
+
377
+ GLU.gluPerspective(gl, 45.0f, ((float) width) / height, 1f, 100f);
378
+
379
+
380
+
381
+ //背面塗り潰し色の指定
382
+
383
+ gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
384
+
385
+
386
+
387
+ //デプスバッファ
388
+
389
+ gl.glEnable(GL10.GL_DEPTH_TEST);
390
+
391
+ gl.glEnable(GL10.GL_CULL_FACE);
392
+
393
+ gl.glDepthFunc(GL10.GL_LEQUAL);
394
+
395
+ gl.glClearDepthf(1.0f);
396
+
397
+
398
+
399
+ //シェーディング
400
+
401
+ gl.glShadeModel(GL10.GL_SMOOTH);
402
+
403
+ }
404
+
405
+
406
+
407
+ @Override
408
+
409
+ public void onResume() {
410
+
411
+ super.onResume();
412
+
413
+
414
+
415
+ //センサーのインスタンス初期化
416
+
417
+ if (sensorManager == null) {
418
+
419
+ sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
420
+
421
+ }
422
+
423
+
424
+
425
+ //磁界センサーのリスナー登録
426
+
427
+ List<Sensor> sensorsMagnetic = sensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
428
+
429
+ //加速度センサーのリスナー登録
430
+
431
+ List<Sensor> sensorsAcceler = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
432
+
433
+
434
+
435
+ if (sensorsMagnetic.size() > 0 && sensorsAcceler.size() > 0) {
436
+
437
+ sensorMRegisted = sensorManager.registerListener(this, sensorsMagnetic.get(0), SensorManager.SENSOR_DELAY_FASTEST);
438
+
439
+ sensorARegisted = sensorManager.registerListener(this, sensorsAcceler.get(0), SensorManager.SENSOR_DELAY_FASTEST);
440
+
441
+ } else {
442
+
443
+ //センサーが不足していればメッセージを表示
444
+
445
+ Toast.makeText(getApplicationContext(), "Sensors are running short!", Toast.LENGTH_LONG).show();
446
+
447
+ }
448
+
449
+ }
450
+
451
+
452
+
453
+ @Override
454
+
455
+ public void onPause() {
456
+
457
+ super.onPause();
458
+
459
+
460
+
461
+ //センサー解除
462
+
463
+ if (sensorMRegisted || sensorARegisted) {
464
+
465
+ sensorManager.unregisterListener(this);
466
+
467
+ sensorMRegisted = false;
468
+
469
+ sensorARegisted = false;
470
+
471
+ }
472
+
473
+ }
474
+
475
+
476
+
477
+ /*
478
+
479
+ * onSensorChanged()はセンサの値が変更された際に呼び出されるメソッド
480
+
481
+ */
482
+
483
+ @Override
484
+
485
+ public void onSensorChanged(SensorEvent event) {
486
+
487
+ switch (event.sensor.getType()) {
488
+
489
+ case Sensor.TYPE_MAGNETIC_FIELD:
490
+
491
+ magneticValues = event.values.clone();
492
+
493
+ break;
494
+
495
+ case Sensor.TYPE_ACCELEROMETER:
496
+
497
+ accelerometerValues = event.values.clone();
498
+
499
+ break;
500
+
501
+ }
502
+
503
+
504
+
505
+ //センサーから得た値を端末の傾き角度に変換する処理
506
+
507
+ if (magneticValues != null && accelerometerValues != null) {
508
+
509
+ SensorManager.getRotationMatrix(inR, I, accelerometerValues, magneticValues);
510
+
511
+ //Activityの表示が縦固定の場合。横向きになる場合は要修正
512
+
513
+ SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);
514
+
515
+
516
+
517
+ SensorManager.getOrientation(outR, orientationValues);
518
+
519
+
520
+
521
+ //ラジアンを角度に変換
522
+
523
+ orientDgrees[0] = (int) Math.toDegrees(orientationValues[0]);
524
+
525
+ orientDgrees[1] = (int) Math.toDegrees(orientationValues[1]);
526
+
527
+ orientDgrees[2] = (int) Math.toDegrees(orientationValues[2]);
528
+
529
+ }
530
+
531
+ }
532
+
533
+
534
+
535
+ @Override
536
+
537
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
538
+
539
+ }
540
+
541
+ }
542
+
543
+
544
+
545
+ private static FloatBuffer makeFloatBuffer(float[] values) {
546
+
547
+ ByteBuffer bb = ByteBuffer.allocateDirect(values.length * 4);
548
+
549
+ bb.order(ByteOrder.nativeOrder());
550
+
551
+ FloatBuffer fb = bb.asFloatBuffer();
552
+
553
+ fb.put(values);
554
+
555
+ fb.position(0);
556
+
557
+ return fb;
558
+
559
+ }
560
+
561
+ }
562
+
563
+ ```