किसी सीन को बनाना और उससे इंटरैक्ट करना

इस पेज पर, Scene बनाने और उससे इंटरैक्ट करने से जुड़ी आम सलाह दी गई हैं.

एआर (ऑगमेंटेड रिएलिटी) के बिना किसी सीन को रेंडर करना

SceneView क्लास की मदद से, आप डिवाइस के कैमरे या एआर (ऑगमेंटेड रिएलिटी) सेशन के बिना, 3D सीन रेंडर कर सकते हैं. यह बिना एआर के अपने ऐप्लिकेशन में 3D ऑब्जेक्ट की झलक देखने या उन डिवाइसों पर वैकल्पिक फ़ंक्शन देने के लिए फ़ायदेमंद है जिन पर एआर (ऑगमेंटेड रिएलिटी) काम नहीं करता.

SceneView डिफ़ॉल्ट रूप से, एआर कैमरे से इमेज नहीं दिखाता, और काले बैकग्राउंड का इस्तेमाल करता है. बैकग्राउंड का रंग बदलने के लिए, आप view.setBackgroundColor() पर कॉल कर सकते हैं या नीचे दिए गए लेआउट की मदद से बैकग्राउंड का रंग तय कर सकते हैं:

<com.google.ar.sceneform.SceneView
    android:id="@+id/scene_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/deep_teal"/>

सीन और #Camera नोड को ऑरिजिन (पोज़िशन 0,0,0) पर रखा जाता है और आगे की ओर (निर्देश 0,0,-1) लगाया जाता है. कैमरा और उसकी स्थिति, एआर (ऑगमेंटेड रिएलिटी) मोशन ट्रैकिंग से जुड़ी नहीं होती हैं. इसलिए, आप किसी भी दूसरे नोड की तरह इसकी जगह बदल सकते हैं या ऐनिमेट कर सकते हैं.

Camera camera = sceneView.getScene().getCamera();
camera.setLocalRotation(Quaternion.axisAngle(Vector3.right(), -30.0f));

इंटरैक्शन

उपयोगकर्ता के टच को मैनेज करें

जब उपयोगकर्ता स्क्रीन को छूता है, तो \tform की मदद से, टच इवेंट को इवेंट के हैंडलर और नोड के साथ अटैच लिसनर के साथ शेयर किया जाता है. यह व्यवहार Android के व्यू और व्यू ग्रुप में होने वाले टच इवेंट की तरह ही है. यहां पेश किए जाने के क्रम का क्रम:

  1. इवेंट scene.addOnPeekTouchListener() में जोड़े गए किसी भी लिसनर के पास भेजा जाता है.

    यह viewGroup.intercept() से मिलता-जुलता है, बस एक ही नज़र वाले टच सुनने वाले पर इवेंट का इस्तेमाल नहीं किया जा सकता.

  2. इवेंट को उस पहले नोड को पास किया जाता है जिससे रे को कांटता है.

    • नोड, इवेंट को खर्च कर सकता है. इसके लिए, आपको onTouchEvent() मेथड सेट करना होगा, जो true दिखाता है.
    • अगर onTouchEvent() मैथड से false मिलता है या कोई लिसनर तय नहीं है, तो इवेंट को नोड और पैरंट की पैरंट वैल्यू में बदल दिया जाता है. यह प्रोसेस तब तक जारी रहती है, जब तक इवेंट पूरा नहीं हो जाता या इवेंट खत्म नहीं हो जाता.
  3. आखिर में, अगर किसी दर्शक ने इवेंट का इस्तेमाल नहीं किया है, तो इवेंट को scene.onTouchListener() में पास कर दिया जाता है.

जेस्चर की पहचान करना

ArFragment पर टैप करने (चुनने), खींचने (मूव करने), पिंच करने (स्केल करने), और घुमाने (घुमने) के लिए, जेस्चर (हाव-भाव) की सुविधा पहले से मौजूद है.

उदाहरण के लिए, HelloScineform सैंपल ऐप्लिकेशन में HelloSceneformActivity.java देखें.

कस्टम नोड बनाएं

पसंद के मुताबिक Android व्यू बनाने की तरह ही, Node को सब-क्लास करके कस्टम नोड बनाए जा सकते हैं. यहां कुछ स्थितियां दी गई हैं, जिनके आधार पर आप कस्टम नोड बना सकते हैं:

  • आप नोड की लाइफ़साइकल में मौजूद इवेंट को ऐक्सेस करना चाहते हैं, जैसे कि onUpdate(), onActivate, और onDeactivate().
  • आप एक नोड बनाना चाहते हैं, जो नोड के किसी समूह से मिलकर बना हो.
  • आप बहुत सारे कोड का डुप्लीकेट बना रहे हैं और इसे एक सब-क्लास से तय किया जा सकता है.

उदाहरण के लिए, सोलर सिस्टम सैंपल ऐप्लिकेशन में Planet.java देखें.

नोड को ऐनिमेट करें

नोड को ऐनिमेट करने के दो तरीके हैं:

  • स्टैंडर्ड Android ऐनिमेशन एपीआई में जाकर ObjectAnimator का इस्तेमाल करें.
  • कस्टम नोड क्लास बनाएं और onUpdate() को बदलें

ObjectAnimator के साथ ऐनिमेट करें

यहां एक उदाहरण दिया गया है जो स्पॉटलाइट की तीव्रता को ऐनिमेट करता है:

final int durationInMilliseconds = 1000;
final float minimumIntensity = 1000.0f;
final float maximumIntensity = 3000.0f;
ValueAnimator intensityAnimator =
    ObjectAnimator.ofFloat(
        spotlightNode.getLight(), "intensity", minimumIntensity, maximumIntensity);
intensityAnimator.setDuration(durationInMilliseconds);
intensityAnimator.setRepeatCount(ValueAnimator.INFINITE);
intensityAnimator.setRepeatMode(ValueAnimator.REVERSE);
intensityAnimator.start();

ज़्यादा जानकारी के लिए, ObjectAnimator के साथ ऐनिमेट करना देखें.

OnUpdate में ऐनिमेट करें

नोड और फ़्रेम को ऐनिमेशन में फ़्रेम करने के लिए, इसके onUpdate() को बदलें. नीचे दिए गए उदाहरण में, सोलर सिस्टम सैंपल ऐप्लिकेशन में Planet.java के उदाहरण में, उपयोगकर्ता को दिखने वाली हर फ़्रेम में जानकारी कार्ड को अडजस्ट किया गया है. भले ही, ग्रह घूम रहा हो.

@Override
public void onUpdate(FrameTime frameTime) {
  Vector3 cameraPosition = getScene().getCamera().getWorldPosition();
  Vector3 cardPosition = infoCard.getWorldPosition();
  Vector3 direction = Vector3.subtract(cameraPosition, cardPosition);
  Quaternion lookRotation = Quaternion.lookRotation(direction, Vector3.up());
  infoCard.setWorldRotation(lookRotation);
}

लाइटें जोड़ें

Lights को, सीन में मौजूद किसी भी नोड में अटैच किया जा सकता है. डिफ़ॉल्ट रूप से, हर सीन के सीन में Sun नोड शामिल होता है, जिसमें दिशा बताने वाली एक लाइट लगी होती है.

आप सूरज की रोशनी में बदलाव कर सकते हैं या किसी सीन में अपनी लाइटें जोड़ सकते हैं. नीचे दिए गए उदाहरण में एक स्पॉटलाइट जोड़ा गया है:

Light spotLightYellow =
    Light.builder(this, Light.Type.FOCUSED_SPOTLIGHT)
        .setColor(new Color(android.graphics.Color.YELLOW))
        .setShadowCastingEnabled(true)
        .build();

फिर उसे किसी नोड में अटैच करने के लिए setLight() को कॉल करें.

हवाई जहाज़ विज़ुअलाइज़ेशन अपने हिसाब से बनाना

डिफ़ॉल्ट रूप से, सीन में PlaneRenderer होता है, जब ARCore को Planes की पहचान होती है. यह ऐसा दिखता है:

आप डिफ़ॉल्ट प्लान और उसके कॉन्टेंट में बदलाव कर सकते हैं. ऐसा करके, आप उस हवाई जहाज़ को रेंडर कर सकते हैं जिसका पता लगाया गया है. यहां स्ट्रक्चर को बदलने का तरीका दिया गया है:

Texture.Sampler sampler =
        Texture.Sampler.builder()
                .setMinFilter(Texture.Sampler.MinFilter.LINEAR)
                .setWrapMode(Texture.Sampler.WrapMode.REPEAT)
                .build();

// R.drawable.custom_texture is a .png file in src/main/res/drawable
Texture.builder()
        .setSource(this, R.drawable.custom_texture)
        .setSampler(sampler)
        .build()
        .thenAccept(texture -> {
          arSceneView.getPlaneRenderer()
                  .getMaterial().thenAccept(material ->
                  material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture));
        });

गहरे हिस्सों को हल्का करें

शैडो की मदद से, दुनिया भर में रेंडर किए जा सकने वाले प्रॉडक्ट बनाए जा सकते हैं. इससे उपयोगकर्ताओं को गहराई और जगह का पता चलता है.

सीन के आकार में ऐसे ऑब्जेक्ट होते हैं, जो शैडो बना सकते हैं और ऐसे ऑब्जेक्ट होते हैं जिन्हें शैडो मिला.

  • Lights और Renderables शैडो को कास्ट कर सकते हैं

    डिफ़ॉल्ट रूप से, सूरज की रोशनी के लिए शैडो कास्टिंग चालू होती है. रोशनी के लिए यह सुविधा चालू नहीं है. इसे चालू करने के लिए setShadowCastingEnabled() को कॉल करें.

  • Renderables और PlaneRenderer को शैडो किया जा सकता है.

    डिफ़ॉल्ट रूप से, परछाई पाने की सुविधा चालू होती है. इसे बंद करने के लिए, setShadowReceiver() पर कॉल करें.

अगर रेंडर करने की सुविधा किसी डिवाइस को कास्ट करती है और शैडो करती है, तो वह खुद ही शैडो कर सकती है.