2014-06-20 10 views
6

का उपयोग कर 3 डी स्पेस में एक एससीएनओडी ऑब्जेक्ट को घुमाएं मैं सीनकेकिट के आसपास अपना रास्ता सीखने की कोशिश कर रहा हूं और उदाहरण के तौर पर, मैंने सोचा कि मैं एसडीके का उपयोग कर सौर प्रणाली बनाने की कोशिश करूंगा। मैं एससीएनओडी ऑब्जेक्ट्स जोड़ने और पैटर्न और प्रकाश जैसे सामग्री गुणों को कॉन्फ़िगर करने में सक्षम हूं। इसके अलावा, मैं ग्रहों को घुमाने में सक्षम हूं, लेकिन मुझे समझ में नहीं आ रहा है कि मैं उन्हें किसी विशेष पथ के साथ "घूमता" कैसे करूं।SceneKit

मेरे कोड अब तक लगता है कि:

// create a new scene 
SCNScene *scene = [SCNScene scene]; 

// create and add a camera to the scene 
SCNNode *cameraNode = [SCNNode node]; 
cameraNode.camera = [SCNCamera camera]; 
[scene.rootNode addChildNode:cameraNode]; 

// place the camera 
cameraNode.position = SCNVector3Make(0, 0, 2); 

// create and add a 3d sphere - sun to the scene 
SCNNode *sphereNode = [SCNNode node]; 
sphereNode.geometry = [SCNSphere sphereWithRadius:0.3]; 
[scene.rootNode addChildNode:sphereNode]; 

// create and configure a material 
SCNMaterial *material = [SCNMaterial material]; 
material.diffuse.contents = [NSImage imageNamed:@"SunTexture"]; 
material.specular.contents = [NSColor whiteColor]; 
material.specular.intensity = 0.2; 
material.locksAmbientWithDiffuse = YES; 

// set the material to the 3d object geometry 
sphereNode.geometry.firstMaterial = material; 

// create and add a 3d sphere - earth to the scene 
SCNNode *earthNode = [SCNNode node]; 
earthNode.geometry = [SCNSphere sphereWithRadius:0.15]; 
NSLog(@"Sun position = %f, %f, %f", sphereNode.position.x, sphereNode.position.y, sphereNode.position.z); 
earthNode.position = SCNVector3Make(0.7, 0.7, 0.7); 
NSLog(@"Earth position = %f, %f, %f", earthNode.position.x, earthNode.position.y, earthNode.position.z); 
//earthNode.physicsBody = [SCNPhysicsBody dynamicBody]; 
[scene.rootNode addChildNode:earthNode]; 

SCNMaterial *earthMaterial = [SCNMaterial material]; 
earthMaterial.diffuse.contents = [NSImage imageNamed:@"EarthTexture"]; 

earthNode.geometry.firstMaterial = earthMaterial; 

मैं AppleDocs कि आप सूर्य की समन्वय प्रणाली में और रूट नोड में नहीं ग्रहों जोड़ने की जरूरत में कहीं पढ़ा है लेकिन मुझे यकीन है कि अगर मैं समझ नहीं कर रहा हूँ वैसे भी ठीक है।

मुझे बताएं कि आप इसे करने के बारे में कैसे प्राप्त करते हैं।

उत्तर

12

SceneKit एक एनिमेट-साथ-पथ API प्रदान नहीं करता है। हालांकि, सौर मंडल की तरह कुछ स्थापित करने के कई तरीके हैं।

  1. कभी देखा गया orrery? यह मॉडल है जो SCNNode दस्तावेज में थोड़ा सा बात कर रहा है; यह भी है कि WWDC presentation "दृश्य ग्राफ सारांश" स्लाइड पर क्या करता है। चाल यह है कि आप सूरज के चारों ओर एक ग्रह की क्रांति के संदर्भ के फ्रेम का प्रतिनिधित्व करने के लिए एक नोड का उपयोग करते हैं - जैसे आर्द्रता जिसमें एक ऑर्री में ग्रह होता है, यदि आप इस नोड को अपने केंद्रीय धुरी के चारों ओर घूमते हैं, तो आप जिस बच्चे नोड को संलग्न करते हैं यह एक गोलाकार पथ का पालन करेगा। इस के लिए प्रासंगिक कोड (बस नोड पदानुक्रम सेटअप यहाँ दिखाने के लिए सघन) नमूना कोड परियोजना में ASCSceneGraphSummary.m में है:

    // Sun 
    _sunNode = [SCNNode node]; 
    _sunNode.position = SCNVector3Make(0, 30, 0); 
    [self.contentNode addChildNode:_sunNode]; 
    
    // Earth-rotation (center of rotation of the Earth around the Sun) 
    SCNNode *earthRotationNode = [SCNNode node]; 
    [_sunNode addChildNode:earthRotationNode]; 
    
    // Earth-group (will contain the Earth, and the Moon) 
    _earthGroupNode = [SCNNode node]; 
    _earthGroupNode.position = SCNVector3Make(15, 0, 0); 
    [earthRotationNode addChildNode:_earthGroupNode]; 
    
    // Earth 
    _earthNode = [_wireframeBoxNode copy]; 
    _earthNode.position = SCNVector3Make(0, 0, 0); 
    [_earthGroupNode addChildNode:_earthNode]; 
    
    // Moon-rotation (center of rotation of the Moon around the Earth) 
    SCNNode *moonRotationNode = [SCNNode node]; 
    [_earthGroupNode addChildNode:moonRotationNode]; 
    
    // Moon 
    _moonNode = [_wireframeBoxNode copy]; 
    _moonNode.position = SCNVector3Make(5, 0, 0); 
    [moonRotationNode addChildNode:_moonNode]; 
    
  2. आप एक एनीमेशन है कि एक विशेष पथ आप 3 डी अंतरिक्ष में मॉडल का अनुसरण नहीं कर सकते, लेकिन आप एक कीफ्रेम एनीमेशन बना सकते हैं जो 3 डी स्पेस में कई स्थितियों के बीच इंटरपोलेट करता है। नीचे (अनचाहे) कोड xz-plane में एक वर्ग आकार के चारों ओर एक नोड को स्थानांतरित करता है ... राउंडर आकार प्राप्त करने के लिए और अंक जोड़ें।

    CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPaths:@"position"]; 
    anim.values = @[ 
        [NSValue valueWithSCNVector3:SCNVector3Make(0, 0, 1)], 
        [NSValue valueWithSCNVector3:SCNVector3Make(1, 0, 0)], 
        [NSValue valueWithSCNVector3:SCNVector3Make(0, 0, -1)], 
        [NSValue valueWithSCNVector3:SCNVector3Make(-1, 0, 0)], 
    ]; 
    [node addAnimation:anim forKey:"orbit"]; 
    
  3. भौतिकी का प्रयोग करें! SCNPhysicsField वर्ग मॉडल रेडियल गुरुत्वाकर्षण, तो आप केवल एक गुरुत्वाकर्षण क्षेत्र को एक दृश्य में छोड़ सकते हैं, ग्रहों के लिए कुछ भौतिकी निकायों को जोड़ सकते हैं, और वापस बैठ सकते हैं और अपने सौर मंडल को देख सकते हैं cataclymmically खुद को नष्ट कर सकते हैं जीवन में आओ! यथार्थवादी व्यवहार प्राप्त करने में बहुत सारे परीक्षण और त्रुटि होती है - आपको प्रत्येक ग्रह के लिए प्रारंभिक वेग निर्धारित करने की आवश्यकता होगी, जिसे आप अपनी कक्षा की अपेक्षा करते हैं, और उस वेग को सही करने के लिए उस वेग को ट्विक करें। हमारे सौर मंडल के लिए कुछ इफेमेरिस डेटा की खोज करने से मदद मिल सकती है।

+0

कामकाज के रूप में, मैंने आपके बिंदु की तरह कुछ लागू किया है। विस्तृत उत्तर के लिए धन्यवाद और भौतिकी को लागू करने का विचार रोमांचक लगता है। –

+0

बहुत बढ़िया। बस ... बस कमाल है। – Nerrolken

+0

इससे बहुत मदद मिलती है। इसके अलावा, अगर आपने ऑर्री के साथ जाने का फैसला किया है और आप चाहते हैं कि आपके सभी ग्रहों के पास अलग-अलग पथ हों। आप हमेशा सूर्य के केंद्र में छिपा नोड जोड़ सकते हैं और अपनी धुरी घुमा सकते हैं;) – doNotCheckMyBlog

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