2014-04-15 11 views
5

मैं इसके लिए एक निष्कर्ष के लिए थोड़ी देर के लिए देख रहा हूं, लेकिन मुझे इसका कोई समाधान नहीं मिल रहा है।फिजिज, आंदोलन और भौतिकी का संयोजन

मैं THREE.JS और PHYSI.JS का उपयोग करके काम करने के लिए एक छोटी प्लेटफॉर्म कार्रवाई करने के लिए एक साधारण दृश्य बनाने की कोशिश कर रहा हूं। मेरे पास एक कामकाजी बॉक्स है जो 0 के द्रव्यमान के साथ काम करता है और मेरे चरित्र के रूप में कार्य करने के लिए एक बॉक्स जाल है। फिजिज की साइट का सुझाव है कि मैंने __dirtyPosition वैरिएबल को true पर सेट किया है। यहां समस्या यह है: __dirtyPosition भौतिकी के साथ गड़बड़ करता है। जैसे ही मैं अपने चरित्र को स्तर के किनारे से ऊपर ले जाता हूं, वह गिर नहीं रहा है। वास्तव में, यह टकराव करता है जब यह दुनिया घन आधा रास्ते बंद करना प्रतीत होता है।

जब मैं __dirtyPosition लागू किए बिना स्थिति को अपडेट करने का प्रयास करता हूं, तो घन को इसके स्थान पर वापस रखा जाता है। यह थोड़ा सा थरथराता है जैसे कि यह एक छोटा जब्त हो रहा है और यही वह है। यह बहुत अच्छा होगा अगर मैं भौतिकी और आंदोलन दोनों का उपयोग कर सकता हूं, फिजी का उपयोग केवल टकराव के लिए करता है, ऐसा लगता है कि इसे अधिक पसंद है।

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

इस समारोह जहां 'स्तर', दोनों चरित्र और दुनिया के साथ बनाया जाता है: यहाँ मैं इसे कैसे अब स्पष्ट रूप से गलत तरीके से करते हैं, है। लेवल ऑब्जेक्ट में क्या शामिल है, एक अपडेट फ़ंक्शन है जो अनुरोध के बाद चलता है एनीमेशन फ्रेम फ़ंक्शन कहा जाता है, और रेंडरर प्रस्तुत करने से ठीक पहले।

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

मुझे पता है कि समान प्रश्न पॉप अप हो गए हैं, लेकिन किसी ने वास्तव में संतोषजनक उत्तर नहीं दिए हैं। मैं वास्तव में क्या करना है, या मुझे कौन से कार्यों का उपयोग करना चाहिए, इसके नुकसान पर वास्तव में हूं।

संपादित मैं इस हिस्से को जोड़ने के लिए भूल गया: मैं एक छोटे से ढांचा निर्धारित करता है कि क्या मैं एक Three.js वस्तु या एक PHYSI.js उद्देश्य यह है कि मेरे खेल और के बीच एक पुल के रूप में काम करता है मिलना चाहिए उपयोग कर रहे हैं मेरे पुस्तकालयों। ये THREE.js और PHYSI.js के समान पैरामीटर का पालन करते हैं, मैंने टिप्पणियों के साथ चिह्नित किया है जो फ़ंक्शन किस प्रकार की ऑब्जेक्ट देता है।

+0

मुझे प्यार है कि कितने भौतिकी इंजन बस एक उचित किनेमेटिक चरित्र नियंत्रक को लागू नहीं करते हैं। फिर प्रतीक्षा करें, दूसरा तो। नफरत है। – jozxyqk

उत्तर

1

ठीक अक्षम करता है। सबसे पहले, आपको __dirtyPosition का उपयोग गति से काम करने के लिए करना चाहिए। मैं setLinearVelocity और 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 
} 

दूसरा, कारण आप इस समस्या शायद इसलिए है क्योंकि आप true को __dirtyRotation ध्वज सेट नहीं किया है। आपके पास एक छोटा सा क्षेत्र था जहां आप रोटेशन को रीसेट करना चाहते थे। इसके अलावा, मुझे आपके द्वारा पोस्ट की गई चीज़ों से कुछ भी गलत नहीं दिख रहा है।

0

सिर्फ एक घन चरित्र आंदोलन के लिए, बजाय object.__dirtyPosition का उपयोग करने का object.setLinearVelocity(vector) कोशिश,

मुझे लगता है कि आम तौर पर __dirtyPosition भौतिकी प्रभाव का सबसे

संबंधित मुद्दे