2014-04-15 14 views
5

Ich habe mich schon eine Weile umgesehen, aber ich kann keine Lösung finden.Physijs, Bewegung und Physik kombinierend

Ich versuche, eine einfache Szene zu erstellen, um eine kleine Plattform Aktion mit THREE.JS und PHYSI.JS zu arbeiten. Ich habe eine flache Box mit einer Masse von 0, um als meine Arbeit zu fungieren, und eine Box-Masche, um als mein Charakter zu fungieren. Die Website von Physijs scheint darauf hinzuweisen, dass ich die Variable __dirtyPosition auf true gesetzt habe. Das Problem ist hier: __dirtyPosition versagt mit der Physik. Wenn ich meinen Charakter vom Rand des Levels wegbewege, fällt er nicht. Tatsächlich scheint es auf halbem Weg des Weltwürfels zu stoppen, wenn es kollidiert.

Wenn ich versuche, die Position ohne Anwendung von __dirtyPosition zu aktualisieren, wird der Würfel wieder an seinen Platz gesetzt. Es zittert ein bisschen, als hätte es einen kleinen Anfall und das war's. Es wäre toll, wenn ich sowohl Physik als auch Bewegung gebrauchen könnte. Physi zu benutzen, nur um eine Kollision zu erleben, fühlt sich an wie eine Übertreibung. Hier ist, wie ich es jetzt tun, eindeutig in die falsche Richtung:

level1.generateScene = function() 
{ 
    level1.camera = new THREE.PerspectiveCamera(75, this.cameraWidth/this.cameraHeight, 0.1, 1000); 

    level1.material = new AdapterEngine.createBasicMaterial({color: 0x00ff00}); //Threejs basic material 
    level1.ground = new AdapterEngine.createBoxMesh(5, 0.1, 5, level1.material, 0); //Physijs box mesh with a mass of 0 

    level1.playerMaterial = new AdapterEngine.createBasicMaterial({color:0x0000ff}, 0.6, 0.3); //Physijs basic material with a fruction of 0.6, and a restitution of 0.3 
    level1.player = new AdapterEngine.createBoxMesh(0.3, 0.3, 0.3, level1.playerMaterial, 0.1); //Physijs box mesh with a mass of 0.1 
    level1.player.y = 50; //yes, it should fall down for a bit. 

    level1.scene.add(level1.ground); 
    level1.scene.add(level1.player); 

    level1.camera.position.z = 5; 
    level1.camera.position.y = 1.4; 
    level1.activeCamera = level1.camera; 
    level1.controls.init(); 
} 

Dies ist die Funktion, wo die ‚Ebene‘, sowohl mit Charakter und Welt geschaffen wird. Was das Level-Objekt auch enthält, ist eine Update-Funktion, die nach dem Aufruf der requestAnimationframe-Funktion abgespielt wird, und zwar unmittelbar bevor der Renderer rendert.

level1.update = function() 
{ 
    this.scene.simulate(); 

    level1.player.__dirtyPosition = true; 
    if(level1.controls.isKeyDown('RIGHT')) level1.xvelocity = 0.1; 
    else if(level1.controls.isKeyDown('LEFT')) level1.xvelocity = -0.1; 
    else if(level1.controls.isKeyUp('RIGHT') || level1.controls.isKeyUp('LEFT')) level1.xvelocity = 0; 

    level1.player.rotation.x = 0; 
    level1.player.rotation.y = 0; 
    level1.player.rotation.z = 0; 

    level1.player.position.x = level1.player.position.x + 0.5*level1.xvelocity; 
} 

Ich weiß, ähnliche Fragen sind aufgetaucht, aber keine hat wirklich befriedigende Antworten ergeben. Ich habe wirklich verloren, was zu tun ist oder welche Funktionen ich verwenden soll.

bearbeiten ich diesen Teil hinzuzufügen vergessen: Ich habe ein wenig Framework, das feststellt, ob ich ein Three.js Objekt oder ein PHYSI.js Objekt erhalten soll, die als Brücke zwischen meinem Spiel funktioniert und meine Bibliotheken. Diese folgen denselben Parametern wie THREE.js und PHYSI.js, ich habe mit Kommentaren markiert, welche Funktion welchen Objekttyp zurückgibt.

+0

Ich liebe, wie so viele Physik-Engines einfach nicht einen richtigen kinematischen Charakter-Controller implementieren. Warte nein, der andere dann. Hass. – jozxyqk

Antwort

1

Ok. Zuerst sollten Sie NICHT__dirtyPosition verwenden, um mit der Geschwindigkeit zu arbeiten. Ich empfehle, mit setLinearVelocity und getLinearVelocity:

level1.update = function(){ 
    this.scene.simulate(); 

    // Conditions... 

    var oldVector = this.player.getLinearVelocity(); // Vector of velocity the player already has 
    var playerVec3 = new THREE.Vector3(oldVector.x + .5 * this.xvelocity, oldVector.y, oldVector.z); 
    this.player.setLinearVelocity(playerVec3); // We use an updated vector to redefine its velocity 
} 

Zweitens, die Grund, warum Sie dieses Problem haben, ist wahrscheinlich, weil Sie nicht die __dirtyRotation Flag auf true gesetzt haben. Sie hatten einen kleinen Bereich, in dem Sie die Rotation zurücksetzen wollten. Ansonsten sehe ich nichts falsch von dem, was Sie gepostet haben.

0

Für nur einen einzigen Würfel Charakter Bewegung, versuchen object.setLinearVelocity(vector) statt object.__dirtyPosition der Verwendung

denke ich __dirtyPosition deaktiviert im Allgemeinen die meisten Physik-Effekte