2015-02-26 8 views
6

मैं किसी वेब वर्कर में कुछ Geometry लोडिंग और प्रसंस्करण को ऑफ़लोड करने का प्रयास कर रहा हूं। इसे मुख्य थ्रेड पर वापस भेजने के लिए, Geometry उदाहरण को क्रमबद्ध करने की आवश्यकता है, और ऐसा लगता है कि Geometry.prototype.toJSON() बिल्कुल इस प्रकार की चीज़ के लिए था।Three.js - geometry.toJSON() को deserialize कैसे करें? (geometry.fromJSON कहां है?)

लेकिन मैं यह नहीं समझ सकता कि उस ऑब्जेक्ट को मुख्य थ्रेड में Geometry उदाहरण में कैसे चालू किया जाए। toJSON() आउटपुट का उपयोग कैसे किया जाना चाहिए?

पीएस: मैंने this related question देखा है, लेकिन ऐसा लगता है कि यह दिनांकित है। toJSON() अभी तक एपीआई में नहीं था। स्वीकार्य उत्तर थोड़ा उलझन में है, और मुझे मुख्य धागे में अभी भी कुछ कच्चे काम करने की आवश्यकता है।

+0

आप दस्तावेज में लोडर वर्गों के आसपास देखना चाहिए संदर्भ/लोडर/ऑब्जेक्ट लोडर – nemesv

+1

@nemesv: मैंने देखा है, और देखा है। उन वर्गों का उपयोग 'toJSON()' आउटपुट को 'ज्यामिति' में बदलने के लिए नहीं किया जा सकता है। सिद्धांत रूप में, मैं उनके सभी स्रोत-कोड को समझने की कोशिश कर सकता हूं, और स्क्रैच से एक पूर्ण समाधान लिख सकता हूं, लेकिन इसमें बहुत समय लगेगा। अधिकतर, मैं विश्वास नहीं कर सकता कि एक क्रमिकरण विधि 'toJSON()' deserialize के बिना, मौजूद है। : -/ – mhelvens

+0

देखें कि यह मदद करता है: http://stackoverflow.com/questions/27992147/three-js-include-mesh-data-in-code/27996338#27996338 – WestLangley

उत्तर

2

आप JSONLoader का उपयोग क्यों नहीं करते?

myloader = new THREE.JSONLoader() 
myloader.load("path/to/json", function(geometry,material){ 
    mesh = new THREE.Mesh(geometry,material) 
    scene.add(mesh) 
}) 

या लोड हो रहा है एक JSON उसी तरह

+0

मैं * JSONLoader का उपयोग कर रहा हूं।लेकिन मैं इसे एक कार्यकर्ता धागे में कर रहा हूं, और अब परिणामस्वरूप ज्यामिति (संशोधन के बाद) को मुख्य धागे पर संवाद करने का एक तरीका ढूंढ रहा हूं। – mhelvens

3

फाइल अगर मैं सही ढंग मुद्दे को समझने है:

  • आप एक फ़ाइल जो आपको एक ज्यामिति के रूप में लोड करना चाहते है (obj, एसटीएल, आदि।)।
  • आप इस फ़ाइल को वेबवर्कर में लोड करना चाहते हैं।
  • फिर आप ज्यामिति को मुख्य स्क्रिप्ट पर वापस भेजना चाहते हैं।
  • तो आप फ़ाइलों को जेएसओएन के रूप में मुख्य थ्रेड पर भेजने के बारे में सोच रहे हैं, क्योंकि ऑब्जेक्ट भेजने से समर्थित नहीं है।
  • फिर आप जेसन को मुख्य धागे पर एक ज्यामिति में परिवर्तित कर देंगे।

इस के साथ समस्या यह है कि JSON स्ट्रिंग से एक ज्यामिति में कनवर्ट एक और लोड हो रहा है ऑपरेशन है (जिसके कारण वहाँ JSONLoader है), तो यह है कि बिंदु पर आप के साथ-साथ बस लोड हो रहा है मुख्य थ्रेड पर किया गया हो सकता है।

जिस दृष्टिकोण का मैंने उपयोग किया है वह फ़ाइल को कोष्ठक और मानक के फ्लैट सरणी में लोड करना है, फिर मैं उन्हें वापस बफर जीमेट्री में जोड़ने के लिए मुख्य थ्रेड पर भेजता हूं। आप कुछ और गति प्राप्त करने के लिए स्थानांतरण योग्य वस्तुओं का भी उपयोग कर सकते हैं।

// worker.js 

var vertices = new Float32Array(faces * 3 * 3); 
var normals = new Float32Array(faces * 3 * 3); 

// Load your file into the arrays somehow. 

var message = { 
    status:'complete', 
    vertices: vertices, 
    normals: normals 
}; 

postMessage(message, [message.vertices.buffer, message.normals.buffer]); 

// app.js 

onmessage = function (event) { 

    var vertices = event.data.vertices; 
    var normals = event.data.normals; 

    var geometry = new THREE.BufferGeometry(); 
    geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3)); 
    geometry.addAttribute('normal', new THREE.BufferAttribute(normals, 3)); 

    var material = new THREE.MeshPhongMaterial(); 

    var mesh = new THREE.Mesh(geometry, material); 

    // Do something with it. 

}; 
+0

मैंने एक कार्यकर्ता थ्रेड का उपयोग किया क्योंकि ज्यामिति को अभी भी संसाधित/रूपांतरित करने की आवश्यकता है, जो मुख्य धागे को ध्यान में रखेगा। आपका समाधान पहली नजर में उचित दिखता है, लेकिन यह बहुत लंबा रहा है क्योंकि मैं समस्या पर काम कर रहा था। मैं अभी वास्तव में न्याय नहीं कर सकता। (किसी भी मामले में, यह वास्तव में प्रश्न के उत्तर के रूप में जवाब नहीं देता है।) – mhelvens

+0

सवाल पूछा गया है "ज्यामिति कहाँ है .fromJSON()?" लेकिन ऐसा लगता है कि आप वास्तव में जानना चाहते थे कि किसी वेबवर्कर से ज्यामिति को अवरुद्ध/बंद करने के बिना मुख्य स्क्रिप्ट में कैसे पास किया जाए। मैंने जो तकनीक समझाया वह यह करता है कि, हालांकि लोड करने की बजाय आप प्रसंस्करण कर रहे थे। स्थानांतरित टाइप किए गए सरणी से बफर जीमेट्री बनाना लगभग तुरंत है। मैंने यह सवाल यह पाया कि यह कैसे करना है। – DylanVann

+0

निश्चित रूप से, यह एक उपयोगी उत्तर है (मैंने इसे +1 किया)। लेकिन यह केवल तभी काम करता है जब एक ज्यामिति में डेटा का एकमात्र टुकड़ा होता है, जो अनिवार्य रूप से मामला नहीं है (जैसे एनिमेटेड 3 डी मॉडल के लिए)। हाँ, हम इसे भी जोड़ सकते हैं, लेकिन आदर्श रूप से क्रमिकरण/deserialization सुविधाओं होना चाहिए जो सभी संभावित मॉडल को संभालते हैं, इसलिए हमें इसे कोड और बनाए रखने की आवश्यकता नहीं है। – mhelvens

1

तुम इतनी तरह JSONLoader unserialize ज्यामिति का उपयोग कर सकते हैं: http://threejs.org/docs/#:

var geometry = new THREE.Geometry(); 
var serializedGeometry = geometry.toJSON(); 
var jsonLoader = new THREE.JSONLoader(); 

var result = jsonLoader.parse(serializedGeometry.data); 

var unserializedGeometry = result.geometry; 
संबंधित मुद्दे