Subversion Repositories distributed

Rev

Rev 22 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 22 Rev 26
Line 1... Line 1...
1
package test.fraktal3d;
1
package test.fraktal3d;
2
import com.jme.app.SimpleGame;
2
import com.jme.app.SimpleGame;
3
import com.jme.math.Vector3f;
3
import com.jme.math.Vector3f;
4
import com.jme.renderer.ColorRGBA;
-
 
5
import com.jme.scene.shape.Sphere;
-
 
6
import com.jme.scene.state.MaterialState;
-
 
7
import com.jme.util.Timer;
4
import com.jme.scene.Node;
8
 
5
 
9
public class BouncingBall extends SimpleGame {
6
public class BouncingBall extends SimpleGame {
10
 
7
 
11
        // Modellvariablen
-
 
12
        private Room room = new Room(50, 50, 50, 1);
-
 
13
        private Vector3f mBallMove = new Vector3f();;
-
 
14
        private Sphere ball;
-
 
15
 
-
 
16
        // Kräfte
-
 
17
        private Vector3f g_mPerSec = new Vector3f(0, -9.81f, 0);
-
 
18
        private Vector3f bounceLoss_mPerSec = new Vector3f(0.99f, 0.9f, 0.99f);
-
 
19
 
-
 
20
        // Anfangswert
-
 
21
        private Vector3f v_mPerSec = new Vector3f(100, 0, 50);
-
 
22
 
-
 
23
        @Override
8
        @Override
24
        protected void simpleInitGame() {
9
        protected void simpleInitGame() {
25
                this.ball = createBall("Ball", 50, 50, 2);
-
 
26
 
-
 
27
                // Scene einstellen
10
                // Scene einstellen
28
                // Kamaraentfernung erhöhen
11
                // Kamaraentfernung erhöhen
29
                cam.setLocation(new Vector3f(0, 50, 150));
12
                cam.setLocation(new Vector3f(0, 50, 150));
30
 
13
 
31
                // Elemente an rootNode anhängen
14
                // Elemente an rootNode anhängen
32
                rootNode.attachChild(this.room.getRoomNode());
-
 
33
                rootNode.attachChild(this.ball);
-
 
34
        }
-
 
35
 
-
 
36
        private Sphere createBall(String str, int zSam, int radSam, float radius) {
-
 
37
                Sphere ball = new Sphere(str, zSam, radSam, radius);
-
 
38
                ball.setLocalTranslation(this.mBallMove);
-
 
39
 
-
 
40
                MaterialState materialState = display.getRenderer()
-
 
41
                                .createMaterialState();
-
 
42
               
-
 
43
                float opacityAmount = 0.3f;
-
 
44
                materialState
-
 
45
                                .setAmbient(new ColorRGBA(0.0f, 0.0f, 0.0f, opacityAmount));
-
 
46
                materialState
-
 
47
                                .setDiffuse(new ColorRGBA(0.1f, 0.5f, 0.8f, opacityAmount));
-
 
48
                materialState
-
 
49
                                .setSpecular(new ColorRGBA(1.0f, 1.0f, 1.0f, opacityAmount));
-
 
50
                materialState.setShininess(128.0f);
-
 
51
                materialState
-
 
52
                                .setEmissive(new ColorRGBA(0.0f, 0.0f, 0.0f, opacityAmount));
-
 
53
 
-
 
54
                materialState.setEmissive(new ColorRGBA(0.5f, 0.0f, 0.0f, 0.1f));
-
 
55
 
-
 
56
                ball.setRenderState(materialState);
-
 
57
                ball.updateRenderState();
-
 
58
 
-
 
59
                this.mBallMove.y = room.getBorderPosition(RoomBorderEnum.UP).y
-
 
60
                                - ball.getRadius();
-
 
61
                this.mBallMove.x = room.getBorderPosition(RoomBorderEnum.LEFT).x
-
 
62
                                + ball.getRadius();
-
 
63
                this.mBallMove.z = room.getBorderPosition(RoomBorderEnum.LEFT).z
-
 
64
                                + ball.getRadius();
-
 
65
 
-
 
66
                return ball;
-
 
67
        }
-
 
68
 
-
 
69
        @Override
-
 
70
        protected void simpleUpdate() {
-
 
71
                // Frames werden an die Systemzeit angepasst und für das realistische
-
 
72
                // Model variiert
-
 
73
                float time = Timer.getTimer().getTimePerFrame() * 4;
-
 
74
 
-
 
75
                calculateForces(this.mBallMove.x >= room
-
 
76
                                .getBorderPosition(RoomBorderEnum.LEFT).x
-
 
77
                                + ball.getRadius()
-
 
78
                                && this.mBallMove.x <= room
-
 
79
                                                .getBorderPosition(RoomBorderEnum.RIGHT).x
-
 
80
                                                - ball.getRadius(), this.mBallMove.y >= room
-
 
81
                                .getBorderPosition(RoomBorderEnum.DOWN).y
-
 
82
                                + ball.getRadius()
-
 
83
                                && this.mBallMove.y <= room
-
 
84
                                                .getBorderPosition(RoomBorderEnum.UP).y
-
 
85
                                                - ball.getRadius(), this.mBallMove.z >= room
-
 
86
                                .getBorderPosition(RoomBorderEnum.BACK).z
-
 
87
                                + ball.getRadius()
-
 
88
                                && this.mBallMove.z <= room
-
 
89
                                                .getBorderPosition(RoomBorderEnum.FRONT).z
-
 
90
                                                - ball.getRadius(), time);
-
 
91
 
-
 
92
                this.mBallMove.addLocal(this.v_mPerSec.mult(time));
-
 
93
        }
-
 
94
 
-
 
95
        private void calculateForces(boolean xCollision, boolean yCollision,
-
 
96
                        boolean zCollision, float time) {
-
 
97
 
-
 
98
                // Kollision mit den Wänden
-
 
99
                if (!yCollision) {
-
 
100
                        this.bounceLoss_mPerSec.mult(0.9f);
-
 
101
 
-
 
102
                        this.v_mPerSec.x *= this.bounceLoss_mPerSec.x;
-
 
103
                        this.v_mPerSec.y *= -this.bounceLoss_mPerSec.y;
-
 
104
                        this.v_mPerSec.z *= this.bounceLoss_mPerSec.z;
-
 
105
 
-
 
106
                        if (this.mBallMove.y < room.getBorderPosition(RoomBorderEnum.DOWN).y
-
 
107
                                        + ball.getRadius()) {
-
 
108
                                this.mBallMove.y = room.getBorderPosition(RoomBorderEnum.DOWN).y
-
 
109
                                                + ball.getRadius();
-
 
110
 
-
 
111
                        } else {
-
 
112
                                this.mBallMove.y = room.getBorderPosition(RoomBorderEnum.UP).y
-
 
113
                                                - ball.getRadius();
-
 
114
                        }
-
 
115
 
-
 
116
                } else if (!xCollision) {
-
 
117
                        this.v_mPerSec.x *= -this.bounceLoss_mPerSec.y;
-
 
118
                        this.v_mPerSec.y *= this.bounceLoss_mPerSec.x;
-
 
119
                        this.v_mPerSec.z *= this.bounceLoss_mPerSec.z;
-
 
120
 
-
 
121
                        if (this.mBallMove.x < room.getBorderPosition(RoomBorderEnum.LEFT).x
-
 
122
                                        + ball.getRadius()) {
-
 
123
                                this.mBallMove.x = room.getBorderPosition(RoomBorderEnum.LEFT).x
-
 
124
                                                + ball.getRadius();
-
 
125
 
-
 
126
                        } else {
-
 
127
                                this.mBallMove.x = room.getBorderPosition(RoomBorderEnum.RIGHT).x
-
 
128
                                                - ball.getRadius();
-
 
129
                        }
-
 
130
                } else if (!zCollision) {
-
 
131
                        this.v_mPerSec.x *= this.bounceLoss_mPerSec.x;
-
 
132
                        this.v_mPerSec.y *= this.bounceLoss_mPerSec.z;
-
 
133
                        this.v_mPerSec.z *= -this.bounceLoss_mPerSec.y;
-
 
134
 
-
 
135
                        if (this.mBallMove.z < room.getBorderPosition(RoomBorderEnum.BACK).z
15
                new Raumplan(rootNode, 25, 0, 0, 0, LockDirectoryEnum.LOCK_NOTHING).los(rootNode, 25, 0, 0, 0, LockDirectoryEnum.LOCK_NOTHING);
136
                                        + ball.getRadius()) {
-
 
137
                                this.mBallMove.z = room.getBorderPosition(RoomBorderEnum.BACK).z
-
 
138
                                                + ball.getRadius();
-
 
139
 
-
 
140
                        } else {
-
 
141
                                this.mBallMove.z = room.getBorderPosition(RoomBorderEnum.FRONT).z
-
 
142
                                                - ball.getRadius();
-
 
143
                        }
-
 
144
                }
-
 
145
 
-
 
146
                // Kräfte setzen
-
 
147
                this.v_mPerSec.addLocal(this.g_mPerSec.mult(time));
-
 
148
 
16
               
-
 
17
//              rootNode.attachChild(new Raumplan(new Node(), 25, 0, 0, 0, LockDirectoryEnum.LOCK_NOTHING).getRoomNode());
149
        }
18
        }
150
 
19
 
151
        /**
20
        /**
152
         * @param args
21
         * @param args
153
         */
22
         */