質問するログイン新規登録

質問編集履歴

1

コードを一部しか載せていなかったので全文載せました

2018/12/28 07:36

投稿

risushi
risushi

スコア12

title CHANGED
File without changes
body CHANGED
@@ -10,11 +10,53 @@
10
10
 
11
11
  ### 該当のソースコード
12
12
 
13
- ```jacascript
13
+ ```javascript
14
+ // forked from cx20's "Three.js + Oimo.js でドミノっぽくドット絵を作るテスト(サンタバージョン)" http://jsdo.it/cx20/5gmA
15
+ // forked from cx20's "Three.js + Oimo.js でドミノっぽくドット絵を作るテスト" http://jsdo.it/cx20/8ReN
16
+ // forked from cx20's "Three.js + Oimo.js でドット絵を落下させるテスト" http://jsdo.it/cx20/voHQ
17
+ // forked from Lo-Th's "oimo basic" http://jsdo.it/Lo-Th/frXo
18
+
19
+ var DOT_SIZE = 16;
20
+
21
+ // □□□■□□□□□□□□□□□□
22
+ // □■■■■■■□□■□□□■□□
23
+ // □□□■□□□□□■□■■■■■
24
+ // □□□■□□□□□■□□□■□□
25
+ // □□■■■■■□□■□□□■□□
26
+ // □■□■□■□■□■□□□■□□
27
+ // □■□□■□□■□■□□□■□□
28
+ // □□■■□□■□□■□□■□□□
29
+ // □□□□□□□□□□□□□□□□
30
+ // □□□■□□■□□□□□□□□□
31
+ // □■■■■■□■□□■□□■□□
32
+ // □□□■□□□□□□■■■■■□
33
+ // □■■■■■■□□■□■□■□■
34
+ // ■□□■□□□■□■□■□■□■
35
+ // ■□□■□□□■□■□□■□□■
36
+ // □■■□□□■□□□■■□□■□
37
+ var dataSet = [
38
+ "赤","赤","赤","白","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤",
39
+ "赤","白","白","白","白","白","白","赤","赤","白","赤","赤","赤","白","赤","赤",
40
+ "赤","赤","赤","白","赤","赤","赤","赤","赤","白","赤","白","白","白","白","白",
41
+ "赤","赤","赤","白","赤","赤","赤","赤","赤","白","赤","赤","赤","白","赤","赤",
42
+ "赤","赤","白","白","白","白","白","赤","赤","白","赤","赤","赤","白","赤","赤",
43
+ "赤","白","赤","白","赤","白","赤","白","赤","白","赤","赤","赤","白","赤","赤",
44
+ "赤","白","赤","赤","白","赤","赤","白","赤","白","赤","赤","赤","白","赤","赤",
45
+ "赤","赤","白","白","赤","赤","白","赤","赤","白","赤","赤","白","赤","赤","赤",
46
+ "赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤","赤",
47
+ "赤","赤","赤","白","赤","赤","白","赤","赤","赤","赤","赤","赤","赤","赤","赤",
48
+ "赤","白","白","白","白","白","赤","白","赤","赤","白","赤","赤","白","赤","赤",
49
+ "赤","赤","赤","白","赤","赤","赤","赤","赤","赤","白","白","白","白","白","赤",
50
+ "赤","白","白","白","白","白","白","赤","赤","白","赤","白","赤","白","赤","白",
51
+ "白","赤","赤","白","赤","赤","赤","白","赤","白","赤","白","赤","白","赤","白",
52
+ "白","赤","赤","白","赤","赤","赤","白","赤","白","赤","赤","白","赤","赤","白",
53
+ "赤","白","白","赤","赤","赤","白","赤","赤","赤","白","白","赤","赤","白","赤"
54
+ ];
55
+
14
56
  function getRgbColor( c )
15
57
  {
16
58
  var colorHash = {
17
- "黒":0xFF000000,
59
+ "黒":0x000000,
18
60
  "白":0xffffff,
19
61
  "肌":0xffcccc,
20
62
  "茶":0x800000,
@@ -27,6 +69,172 @@
27
69
  };
28
70
  return colorHash[ c ];
29
71
  }
72
+
73
+ // Three.js 用変数
74
+ var camera, scene, light, renderer, container, center;
75
+ var meshs = [];
76
+ var geoBox;
77
+
78
+ // Oimo.js 用変数
79
+ var world;
80
+ var bodys = [];
81
+
82
+ init();
83
+ animate();
84
+
85
+ function init() {
86
+ // カメラを作成する
87
+ camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000);
88
+ camera.position.set(0, 150, 300);
89
+ center = new THREE.Vector3();
90
+ camera.lookAt(center);
91
+
92
+ // シーンを作成する
93
+ scene = new THREE.Scene();
94
+
95
+ // 物理演算の準備
96
+ world = new OIMO.World();
97
+
98
+ // 床を作成する
99
+ createGround();
100
+
101
+ // ドミノを作成する
102
+ createDomino();
103
+
104
+ // ドミノ碑を倒す為の立方体を配置する
105
+ createCube();
106
+
107
+ // ライトを作成する
108
+ light = new THREE.DirectionalLight(0xffffff, 1.3);
109
+ light.position.set(0.3, 1, 0.5);
110
+ scene.add(light);
111
+
112
+ // レンダラーを作成する
113
+ renderer = new THREE.WebGLRenderer();
114
+ renderer.setClearColor(0x0000000);
115
+ renderer.setSize(window.innerWidth, window.innerHeight);
116
+
117
+ // レンダラーのサイズを指定する
118
+ renderer.setSize(window.innerWidth, window.innerHeight);
119
+
120
+ // HTML との紐づけを行う
121
+ container = document.getElementById("container");
122
+ container.appendChild(renderer.domElement);
123
+ }
124
+
125
+ function createGround() {
126
+ // 床の物理演算の設定
127
+ var ground = new OIMO.Body({
128
+ size: [400, 40, 400],
129
+ pos: [0, -50, 0],
130
+ world: world
131
+ });
132
+
133
+ // 床表示用の設定
134
+ var material = new THREE.MeshLambertMaterial({
135
+ color: 0x202020
136
+ });
137
+ var geometry = new THREE.BoxGeometry(400, 40, 400);
138
+ var mesh = new THREE.Mesh(geometry, material);
139
+ mesh.position.y = -50;
140
+ scene.add(mesh);
141
+ }
142
+
143
+ function createDomino() {
144
+ // ドミノ碑のサイズ
145
+ var w = DOT_SIZE * 0.2;
146
+ var h = DOT_SIZE * 1.5;
147
+ var d = DOT_SIZE;
148
+
149
+ // ドミノ碑のベースとなる箱を作成する
150
+ geoBox = new THREE.BoxGeometry(1, 1, 1);
151
+
152
+ var color;
153
+ var i;
154
+ // ドミノ碑を16x16個、整列させる
155
+ for (var x = 0; x < 16; x++) {
156
+ for (var z = 0; z < 16; z++) {
157
+ i = x + (z) * 16;
158
+ y = 0;
159
+ // 物理演算用のオブジェクトを設定
160
+ bodys[i] = new OIMO.Body({
161
+ type: 'box',
162
+ size: [w, h, d],
163
+ pos: [-120 + x * DOT_SIZE, y * DOT_SIZE, -120 + z * DOT_SIZE * 1.2],
164
+ move: true,
165
+ world: world
166
+ });
167
+ // ドミノ碑の色を設定(ドット絵になるよう色を変更)
168
+ color = getRgbColor(dataSet[i]);
169
+ var material = new THREE.MeshLambertMaterial({
170
+ color: color
171
+ });
172
+ // 表示用のオブジェクトを設定
173
+ meshs[i] = new THREE.Mesh(geoBox, material);
174
+ meshs[i].scale.set(w, h, d);
175
+ scene.add(meshs[i]);
176
+ }
177
+ }
178
+ }
179
+
180
+ function createCube() {
181
+ // 立方体のサイズ
182
+ var w = DOT_SIZE;
183
+ var h = DOT_SIZE;
184
+ var d = DOT_SIZE;
185
+ // ドミノ碑を倒す為に、赤色の立方体×16個、配置する。
186
+ var size = bodys.length;
187
+ for (var i = 0; i < 16; i++) {
188
+ var x = 0;
189
+ var y = 2;
190
+ var z = i;
191
+ // 物理演算用のオブジェクトを設定
192
+ bodys[size + i] = new OIMO.Body({
193
+ type: 'box',
194
+ size: [w, h, d],
195
+ pos: [-125 + x * DOT_SIZE, y * DOT_SIZE, -120 + z * DOT_SIZE * 1.2],
196
+ move: true,
197
+ world: world
198
+ });
199
+ // 立方体の色を設定(赤色)
200
+ var material = new THREE.MeshLambertMaterial({
201
+ color: "#f00"
202
+ });
203
+ // 表示用のオブジェクトを設定
204
+ meshs[size + i] = new THREE.Mesh(geoBox, material);
205
+ meshs[size + i].scale.set(w, h, d);
206
+ scene.add(meshs[size + i]);
207
+ }
208
+ }
209
+
210
+ function animate() {
211
+ requestAnimationFrame(animate);
212
+ render();
213
+ }
214
+
215
+ function render() {
216
+ // 物理演算の世界の時間を進める
217
+ world.step();
218
+
219
+ var p, r, m, x, y, z;
220
+ var mtx = new THREE.Matrix4();
221
+ var i = bodys.length;
222
+ var mesh;
223
+
224
+ // ドミノ碑の物理演算を行い位置の算出を行う
225
+ while (i--) {
226
+ var body = bodys[i].body;
227
+ mesh = meshs[i];
228
+ m = body.getMatrix();
229
+ mtx.fromArray(m);
230
+ mesh.position.setFromMatrixPosition(mtx);
231
+ mesh.rotation.setFromRotationMatrix(mtx);
232
+ }
233
+
234
+ // 表示を更新する
235
+ renderer.render(scene, camera);
236
+ }
237
+
30
238
  ```
31
239
 
32
240
  ### 試したこと