-
Notifications
You must be signed in to change notification settings - Fork 0
/
java3D.java
119 lines (95 loc) · 3.89 KB
/
java3D.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package map;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.BoundingSphere;
import javax.vecmath.Point3d;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.PlatformGeometry;
import com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior;
import com.sun.j3d.utils.behaviors.mouse.MouseBehavior;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
/**
*/
class Java3D{
public Java3D(){
}
/**
* 初期化 - キャンバス生成
*/
public static Canvas3D initCanvas(JPanel content){
Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
content.add(canvas, BorderLayout.CENTER);
return canvas;
}
/**
* 初期化 - 空間生成
*/
public static SimpleUniverse initUniverse(Canvas3D canvas, double dist){
// 3D - 空間(空間を構成するオブジェクト群)の作成
SimpleUniverse universe = new SimpleUniverse(canvas);
// 視点 - Z方向へ2.41移動
universe.getViewingPlatform().setNominalViewingTransform();
// 視点 - 奥のクリップ面 (ファー・クリップ面) までの距離設定
universe.getViewer().getView().setBackClipDistance(dist);
// 視点 - 移動
universe.getViewingPlatform().getViewPlatformTransform();
return universe;
}
/**
* イベント処理 - Key
* 動作
* ↑ 前進
* ↓ 後退
* ← 左に向きを変える
* → 右に向きを変える
* PgUp 下に向きを変える (ティルト・ダウン)
* pgDn 上に向きを変える (ティルト・アップ)
* Alt + ← 左に平行移動
* Alt + → 右に平行移動
* Alt + PgUp 上昇 (上方向に平行移動)
* Alt + pgDn 下降 (下方向に平行移動)
* Shift + 他のキー 移動量を大きくする
*/
public static void eventKey(SimpleUniverse universe){
// 視点側の TransformGroup を取得
TransformGroup viewtrans = universe.getViewingPlatform().getViewPlatformTransform();
// 視点側のキーイベント
KeyNavigatorBehavior keybehavior = new KeyNavigatorBehavior(viewtrans);
// 有効領域 - 原点を中心とする半径 100.0 の範囲
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
keybehavior.setSchedulingBounds(bounds);
// キー設定
PlatformGeometry vp = new PlatformGeometry();
vp.addChild(keybehavior);
universe.getViewingPlatform().setPlatformGeometry(vp);
}
/**
* イベント処理 - マウス
* 動作
* 右クリック 回転
* 左クリック 横方向移動
*/
public static void eventMouse(SimpleUniverse universe){
// 視点側の TransformGroup を取得
TransformGroup viewtrans = universe.getViewingPlatform().getViewPlatformTransform();
// 視点側のマウスイベント
MouseBehavior MouseRotate = new MouseRotate(viewtrans);
MouseBehavior MouseTranslate = new MouseTranslate(viewtrans);
MouseBehavior MouseZoom = new MouseZoom(viewtrans);
// 有効領域 - 原点を中心とする半径 100.0 の範囲
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
MouseRotate.setSchedulingBounds(bounds);
MouseTranslate.setSchedulingBounds(bounds);
MouseZoom.setSchedulingBounds(bounds);
// マウス設定
PlatformGeometry vp = new PlatformGeometry();
vp.addChild(MouseRotate);
vp.addChild(MouseTranslate);
vp.addChild(MouseZoom);
universe.getViewingPlatform().setPlatformGeometry(vp);
}
}