E
Expl
Gast
Hallo,
ich hoffe mir kann jemand helfen. Ich versuche eine Kollisionsvermeidung zu programmieren,dazu benutze ich ein
ShapeCylinderSegment. Mein Problem ist, dass mein Objekt , dass ich bewege mit seinem eigenen Radius(ShapeCylinderSegment) kollidiert.
ich hoffe mir kann jemand helfen. Ich versuche eine Kollisionsvermeidung zu programmieren,dazu benutze ich ein
ShapeCylinderSegment. Mein Problem ist, dass mein Objekt , dass ich bewege mit seinem eigenen Radius(ShapeCylinderSegment) kollidiert.
Code:
public class KeyBehavior extends Behavior
{
private TransformGroup transformGroup;
private Transform3D positionTransform3D = new Transform3D();
private WakeupCriterion criterion;
private PickTool picktool;
private PickInfo pr;
private Point3d startP = new Point3d(0.3, 0, 0.3);
private Point3d endP = new Point3d(-0.3, 0, -0.3);
private Vector3f forward = new Vector3f(0f, 0f, -0.3f);
private Vector3f backward = new Vector3f(0f, 0f, 0.3f);
private Box box;
private Vector3f position_Player = new Vector3f(0f, 0f, 0f);
private Transform3D positionT3D = new Transform3D();
float x, y, z;
/* im Konstruktor wird ein Objekt vom Typ TransformGroup �bergeben */
public KeyBehavior(TransformGroup tg, BranchGroup rootBG,Box box)
{
picktool = new PickTool(rootBG);
transformGroup = tg;
this.box = box;
}
/*
* Dient dazu den Behavior zu initialisieren. Es wird eine Variable criterion
* f�r ein neu erzeugtes WakeupCriterion, also ein Aufwachkriterium verwendet.
* Dabei handelt es sich um ein WakeUpOnAWTEventObjekt. Es sorgt daf�r , dass
* jeder Tastendruck registriert wird.
* Die Methode wakeupOn() aktiviert diese Aufwachbedingung f�r das BehaviorObjekt
*/
public void initialize()
{
/*
* Konstruktor WakeupOnAWTEvent legt mit Hilfe des Parameters KeyEvent.KEY_PRESSED fest, dass jede
* gedr�ckte Taste als g�ltige Aufwachbedingung anzusehen ist.
*/
criterion = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
//nach dem aktivieren mittels wakeupOn() ist das Behavior "scharf"
wakeupOn(criterion);
}
/*
* Wird eine Taste gedr�ckt, so wird automatisch die Methode processStimulus()
* aufgerufen. Es wird festegestellt um welche Art vonWakeupCriterion es sich
* handelt um dann dementsprechend zu reagieren. Ein Behavior kann mehrere Aufwachbedingungen haben. Damit
* ausgewertet werden kann, welches Ereignis eben eingetreten ist, wird der Methode
* processStimulus() das jeweilige WakeupCriterionObjekt mitgegeben.
*/
public void processStimulus(Enumeration criteria)
{
AWTEvent AWTEv[];
WakeupCriterion wakeup;
while( criteria.hasMoreElements() )
{
wakeup = (WakeupCriterion) criteria.nextElement();
AWTEv = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
// in der Schleife wird die gedrückte Taste an processKeyEvent übergeben
for( int i = 0; i < AWTEv.length; i++ )
{
if( AWTEv[i].getID() == KeyEvent.KEY_PRESSED )
processKeyEvent((KeyEvent)AWTEv[i]);
}
}
wakeupOn(criterion);
}
// gedrückte Taste wird an moveAllowed() übergeben und geprüft ob man sich bewegen darf
void processKeyEvent(KeyEvent eventKey)
{
int key = eventKey.getKeyCode();
System.out.println(key);
move(key);
}
boolean movePossible(int key)
{
picktool.setShapeCylinderSegment(startP, endP, 0.1); // Radius festlegen
pr = picktool.pickClosest(); // das am naheliegendste Element
// wenn pr != null ist, ist eine Kollision eingetreten und die Bewegung wird nicht ausgeführt
if (pr != null)
{
box.getLocalToVworld(positionT3D);
positionT3D.get(position_Player);
System.out.println("Kollision eingetreten an position: "+position_Player.x+" "+position_Player.y+" "+position_Player.z);
System.out.println("Koordinaten Cylinder");
System.out.println("Startpunkt :"+startP.getX()+ " " + startP.getY()+ " " +startP.getZ());
System.out.println("Endpunkt: "+endP.getX()+ " " + endP.getY()+ " " +endP.getZ());
return false;
}
return true;
}
void move(int key)
{
if (movePossible(key) && key == KeyEvent.VK_UP)
{
Transform3D temp = new Transform3D();
temp.set(forward);
positionTransform3D.mul(temp);
transformGroup.setTransform( positionTransform3D );
}
else if (movePossible(key) && key == KeyEvent.VK_DOWN)
{
Transform3D temp = new Transform3D();
temp.setTranslation(backward);
positionTransform3D.mul(temp);
transformGroup.setTransform( positionTransform3D );
}
else if (movePossible(key) && key == KeyEvent.VK_LEFT)
{
Transform3D temp = new Transform3D();
temp.rotY(Math.toRadians(90));
positionTransform3D.mul(temp);
transformGroup.setTransform( positionTransform3D );
}
// Pfeiltaste links : 2 Grad nach links
else if (movePossible(key) && key == KeyEvent.VK_RIGHT)
{
Transform3D temp = new Transform3D();
temp.rotY(Math.toRadians(-90));
positionTransform3D.mul(temp);
transformGroup.setTransform( positionTransform3D );
}
}
}