2015-02-05 3 views
7

मान लें कि मेरे पास एक कोलाडा फ़ाइल है जिसमें इसमें एक बॉक्स है और मैं दृश्य में डीएई फ़ाइल आयात करता हूं। अब दृश्य में आयात करने के बाद मुझे पता है कि डीएई ऑब्जेक्ट एक बॉक्स है। दृश्यडीएई नोड

पर जोड़ने के बाद मुझे बॉक्स के आयामों को कैसे प्राप्त किया जा सकता है यदि मैं एससीएनबॉक्स के रूप में नोड आयात करता हूं तो मुझे यह कहते हुए त्रुटियां मिलती हैं कि एसएनसीबॉक्स, एससीएनएनोड का उप-प्रकार नहीं है।

floorNode = scene.rootNode.childNodeWithName("floor", recursively: false) as SCNBox 
    floorNode?.physicsBody = SCNPhysicsBody.staticBody() 
    floorNode?.physicsBody?.categoryBitMask = 2 

    let floorGeo: SCNBox = floorNode.geometry! as SCNBox 

एससीएनएनोड नोड्स आयात करने का एकमात्र तरीका है, तो मैं आयाम कैसे प्राप्त करूं?

उत्तर

9

एससीएनबॉक्स सिर्फ सहायक बॉक्स ज्यामिति निर्माण के लिए एससीएनजीओमेट्री के उप-वर्ग है। जब आप कोलाडा को किसी दृश्य में आयात करते हैं, तो आपको एससीएनएनओड्स के साथ एससीएनएनओड्स के दृश्य ग्राफ मिलते हैं, एससीएनबॉक्स या एससीएनसीओएन आदि इससे कोई फर्क नहीं पड़ता कि वे कैसा दिखते हैं। आप SCNBoundingVolume प्रोटोकॉल, जो दोनों SCNNode और SCNGeometry वर्गों द्वारा कार्यान्वित किया जाता है का उपयोग करना चाहिए कि आप किसी भी नोड के आयाम प्राप्त करना चाहते हैं:

func getBoundingBoxMin(_ min: UnsafeMutablePointer, max max: UnsafeMutablePointer) -> Bool

इस प्रक्रिया में बॉक्स कोनों बाउंडिंग हो जाएगा के साथ। बॉक्स के आकार की ज्यामिति के लिए, आयाम बाउंडिंग बॉक्स से मेल खाते हैं।

उदाहरण:

var v1 = SCNVector3(x:0, y:0, z:0) 
var v2 = SCNVector3(x:0, y:0, z:0) 
node.getBoundingBoxMin(&v1, max:&v2) 

कहाँ नोड नोड आप बाउंडिंग के बॉक्स प्राप्त करना चाहते है। परिणाम v1 और v2 में होंगे।

स्विफ्ट 3

स्विफ्ट 3 का उपयोग करते हुए आप बस node.boundingBox.min और node.boundingBox.max क्रमशः उपयोग कर सकते हैं। getBoundingBoxMin उपयोग के बारे में

+0

हाय धन्यवाद !. क्या आप GetBoundingBox फ़ंक्शन का उपयोग कैसे कर सकते हैं? मेरा मतलब है कि मैं असुरक्षित म्यूचुअल पॉइंट्स के अर्थ को समझ नहीं पा रहा हूं। : डी –

+0

उदाहरण के साथ अद्यतन उत्तर। इस मामले में असुरक्षित पॉइंटर्स सी –

+0

ओह ठीक है। धन्यवाद! तो बाध्यकारी बॉक्स का उपयोग करके मैं टकराव की जांच कर सकता हूं? अगर मैं टकराव का पता लगाने के लिए भौतिकी का उपयोग नहीं करना चाहता था। क्या scenekit में intersect की तरह कुछ है। कॉलिशनबॉक्स?!? –

5

उदाहरण तेज कोड:

var min = SCNVector3Zero 
    var max = SCNVector3Zero 
    let b = shipNode.getBoundingBoxMin(&min , max: &max) 
    let w = CGFloat(max.x - min.x) 
    let h = CGFloat(max.y - min.y) 
    let l = CGFloat(max.z - min.z) 
    let boxShape = SCNBox (width: w , height: h , length: l, chamferRadius: 0.0) 
    let shape = SCNPhysicsShape(geometry: boxShape, options: nil) 

    shipNode.physicsBody!.physicsShape = SCNPhysicsShape(geometry: boxShape, options: nil) 
    shipNode.physicsBody = SCNPhysicsBody.dynamicBody()