001: /*
002: * Floor.java
003: *
004: * Created on 15 maj 2007, 12:06
005: *
006: * To change this template, choose Tools | Template Manager
007: * and open the template in the editor.
008: */
009:
010: package jaimoves.util;
011:
012: /**
013: *
014: * @author spin83r
015: */
016:
017: import com.jme.image.Texture;
018: import com.jme.math.Vector3f;
019: import com.jme.scene.Node;
020: import com.jme.scene.shape.Box;
021: import com.jme.system.DisplaySystem;
022: import com.jme.util.TextureManager;
023: import com.jme.scene.state.TextureState;
024: import com.jmex.physics.DynamicPhysicsNode;
025: import com.jmex.physics.Joint;
026: import com.jmex.physics.PhysicsSpace;
027: import com.jmex.physics.RotationalJointAxis;
028: import java.net.URL;
029:
030: import java.lang.Math;
031:
032: public class Floor {
033:
034: private final DynamicPhysicsNode sNode_z;
035: private final DynamicPhysicsNode sNode_x;
036: private final DynamicPhysicsNode floor;
037:
038: private final Joint ground;
039: private final Joint joint_rotZ;
040: private final Joint joint_rotX;
041:
042: private final RotationalJointAxis rotAxisZ;
043: final RotationalJointAxis rotAxisX;
044:
045: /**
046: * Creates a new instance of Floor
047: */
048: public Floor(Node rootNode, PhysicsSpace physics,
049: DisplaySystem display) {
050:
051: sNode_z = physics.createDynamicNode();
052: sNode_z.createBox("box for z");
053: sNode_z.setLocalScale(new Vector3f(0.1f, 0.1f, 0.1f));
054: sNode_z.getLocalTranslation().set(0, -0.5f, 0);
055: sNode_z.setAffectedByGravity(false);
056: rootNode.attachChild(sNode_z);
057:
058: //przyczepienie do podłoża absolutnego
059: ground = physics.createJoint();
060: ground.attach(sNode_z);
061:
062: // druga część podstawy
063: sNode_x = physics.createDynamicNode();
064: sNode_x.createBox("box for x");
065: sNode_x.setLocalScale(new Vector3f(0.15f, 0.15f, 0.15f));
066: sNode_x.getLocalTranslation().set(0, -0.5f, 0);
067: sNode_x.setAffectedByGravity(false);
068: rootNode.attachChild(sNode_x);
069:
070: //obrót wokół osi z
071: joint_rotZ = physics.createJoint();
072: joint_rotZ.attach(sNode_z, sNode_x);
073: rotAxisZ = joint_rotZ.createRotationalAxis();
074: rotAxisZ.setDirection(new Vector3f(0, 0, 1));
075: rotAxisZ.setPositionMinimum(-0.2f);
076: rotAxisZ.setPositionMaximum(0.2f);
077: //rotAxisZ.setAvailableAcceleration( 500 );
078:
079: // podłoga
080: floor = physics.createDynamicNode();
081: final Box visualFloor = new Box("floor", new Vector3f(), 10,
082: 0.25f, 10);
083: floor.attachChild(visualFloor);
084: visualFloor.getLocalTranslation().set(0, 0, 0);
085: floor.generatePhysicsGeometry();
086: floor.setAffectedByGravity(false);
087: floor.setMass(340);
088: final TextureState wallTextureState = display.getRenderer()
089: .createTextureState();
090: URL wall_jpg = Floor.class.getClassLoader().getResource(
091: "jaimoves/files/sciana.jpg");
092: wallTextureState.setTexture(TextureManager.loadTexture(
093: wall_jpg, Texture.MM_LINEAR, Texture.FM_LINEAR));
094: rootNode.attachChild(floor);
095: visualFloor.setRenderState(wallTextureState);
096:
097: //połączenie podłoża i podłogi
098: //obrót dowolny wokuł osi X
099: joint_rotX = physics.createJoint();
100: joint_rotX.attach(sNode_x, floor);
101: rotAxisX = joint_rotX.createRotationalAxis();
102: rotAxisX.setDirection(new Vector3f(1, 0, 0));
103: rotAxisX.setPositionMinimum(-0.2f);
104: rotAxisX.setPositionMaximum(0.2f);
105: //rotAxisX.setAvailableAcceleration( 500 );
106: }
107:
108: public void rotationX(float torque) {
109: float velocity;
110: if (torque < 0) {
111: velocity = -1;
112: } else {
113: if (torque > 0) {
114: velocity = 1;
115: } else {
116: velocity = 0;
117: }
118: }
119: rotAxisX.setDesiredVelocity(velocity);
120: rotAxisX.setAvailableAcceleration(Math.abs(torque));
121: }
122:
123: public void rotationZ(float torque) {
124: float velocity;
125: if (torque < 0) {
126: velocity = -1;
127: } else {
128: if (torque > 0) {
129: velocity = 1;
130: } else {
131: velocity = 0;
132: }
133: }
134: rotAxisZ.setDesiredVelocity(velocity);
135: rotAxisZ.setAvailableAcceleration(Math.abs(torque));
136: }
137:
138: public void keep_position(float torque, boolean X, boolean Z) {
139:
140: float t = Math.abs(torque);
141: if (X) {
142: rotAxisX.setDesiredVelocity(0);
143: rotAxisX.setAvailableAcceleration(t);
144: }
145: if (Z) {
146: rotAxisZ.setDesiredVelocity(0);
147: rotAxisZ.setAvailableAcceleration(t);
148: }
149: }
150:
151: public void keep_position(float torque) {
152: keep_position(torque, true, true);
153: }
154:
155: public float Position_rotationX() {
156: return (rotAxisX.getPosition());
157: }
158:
159: public float Position_rotationZ() {
160: return (rotAxisZ.getPosition());
161: }
162:
163: public void resetFloor() {
164: keep_position(0);
165: floor.getLocalRotation().set(0, 0, 0, 0);
166: floor.getLocalTranslation().set(0, 0, 0);
167: keep_position(600);
168: }
169:
170: }
|