2014-04-15 16 views
5

Mi sono guardato intorno per un po 'ora per una conclusione per questo, ma mi sembra di non essere in grado di trovare alcuna soluzione a questo.Physijs, combinazione di movimento e fisica

Sto cercando di creare una scena semplice per ottenere un po 'di azione sulla piattaforma utilizzando THREE.JS e PHYSI.JS. Ho una scatola piatta con una massa di 0 per agire come il mio workd, e una mesh box per agire come il mio personaggio. Il sito di Physijs sembra suggerire di impostare la variabile __dirtyPosition su true. Il problema qui è questo: __dirtyPosition crea problemi con la fisica. Mentre sposto il mio personaggio dal limite del livello, non sta cadendo. In effetti, sembra fermarsi a metà strada del cubo del mondo quando collide.

Quando si tenta di aggiornare la posizione senza applicare __dirtyPosition, il cubo viene reinserito nella sua posizione. Trema un po 'come se stesse avendo un piccolo attacco e basta. Sarebbe bello se potessi usare sia la fisica che il movimento, usare Physi solo per la collisione sembra un po 'come esagerare. Ecco come lo faccio ora, chiaramente il modo sbagliato:

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(); 
} 

Questa è la funzione in cui viene creato il 'livello', con carattere e mondiale. Ciò che contiene anche l'oggetto livello, è una funzione di aggiornamento che viene riprodotta quando viene chiamata la funzione requestAnimationframe e immediatamente prima del rendering del renderer.

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; 
} 

so domande simili sono saltate fuori, ma nessuno hanno davvero dato risposte soddisfacenti. Sono sinceramente in perdita di cosa fare, o quali funzioni dovrei usare.

modificare Ho dimenticato di aggiungere questa parte: ho usato un po 'di quadro che determina se dovrei ottenere un oggetto o un oggetto di Three.js PHYSI.js che funziona come un ponte tra il mio gioco e la mia librerie. Questi seguono gli stessi parametri di THREE.js e PHYSI.js, ho contrassegnato con commenti quale funzione restituisce quale tipo di oggetto.

+0

Mi piace il modo in cui così tanti motori fisici non implementano un controller di caratteri cinematico appropriato. Aspetta no, l'altro allora. Odiare. – jozxyqk

risposta

1

Ok. Prima di tutto, è necessario NON utilizzare __dirtyPosition per lavorare con velocità. Mi consiglia di utilizzare setLinearVelocity e 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 
} 

secondo luogo di tutti, la ragione si dispone di questo problema è probabilmente perché non è stato impostato il flag __dirtyRotation a true. Hai avuto una piccola area in cui si desidera ripristinare la rotazione. Oltre a questo, non vedo nulla di sbagliato da ciò che hai pubblicato.

0

Per un unico movimento carattere cubo, provare object.setLinearVelocity(vector) invece di utilizzare object.__dirtyPosition,

Penso __dirtyPosition generalmente disabilita la maggior parte degli effetti di fisica