मैं libgdx के कैमरा.प्रोजेक्ट फ़ंक्शन के साथ अपनी 3D दुनिया की वस्तुओं के लिए 2D टेक्स्ट बनाने की कोशिश करता हूं, लेकिन एक अजीब समस्या है।

नीचे दिए गए चित्र देखें: यहां छवि विवरण दर्ज करें

enter image description here

जैसा कि आप तस्वीरों में देख सकते हैं, चित्र 1 में सब ठीक है, लेकिन जब मैं 180 डिग्री के आसपास घूमता हूं तो गेंद का नाम (कोडनाम 1) रिक्त स्थान भी खींच रहा है (चित्र 2)। मुझे समझ नहीं आया कि समस्या क्या है और घंटों सोचने के बाद यहाँ पूछने का फैसला किया। क्रिप्या मेरि सहायता करे।

मेरा कोड है:

public static void drawNames(){
    TheGame.spriteBatch.begin();
    for(int i = 0; i < TheGame.playerMap.size; i++){
        Player ply = TheGame.playerMap.getValueAt(i);
        if(!ply.isAlive)
            continue;
        TheGame.tmpVec.set(ply.getPos().x, ply.getPos().y, ply.getPos().z);
        TheGame.cam.project(TheGame.tmpVec);
        TheGame.fontArialM.draw(TheGame.spriteBatch, ply.name, TheGame.tmpVec.x, TheGame.tmpVec.y, 0, Align.center, false);
    }
    TheGame.spriteBatch.end();
}
1
allyozturk 6 जिंदा 2021, 21:51

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा इसलिए है क्योंकि यदि आप कैमरे के पीछे कुछ प्रोजेक्ट करते हैं तो यह अभी भी project विधि से वैध स्क्रीन निर्देशांक प्राप्त करता है। निम्नलिखित पर विचार करें जो दो विश्व निर्देशांक के स्क्रीन निर्देशांक को प्रिंट करता है

        PerspectiveCamera camera = new PerspectiveCamera(60, 800, 600);
        camera.position.set(0, 0, -10);
        camera.lookAt(0, 0, 0);
        camera.update();

        Vector3 temp = new Vector3();
        Vector3 p1 = new Vector3(1, 0, 10); // This is in front of the camera, slightly to the right
        Vector3 p2 = new Vector3(0, 0, -100); // This is behind of the camera

        camera.project(temp.set(p1));
        System.out.println("p1 is at screen " + temp);
        if (camera.frustum.pointInFrustum(p1))
            System.out.println("p1 is visible to the camera");
        else
            System.out.println("p1 is not visible to the camera");

        camera.project(temp.set(p2));
        System.out.println("p2 is at screen " + temp);
        if (camera.frustum.pointInFrustum(p2))
            System.out.println("p2 is visible to the camera");
        else
            System.out.println("p2 is not visible to the camera");

अपने कोड में, टेक्स्ट को रेंडर करने से पहले आपको यह जांचना होगा कि क्या ply.getPos() वेक्टर कैमरे को दिखाई दे रहा है, और अगर टेक्स्ट है तो ही उसे रेंडर करें।

if (TheGame.cam.frustum.pointInFrustum(ply.getPos()) {
    TheGame.tmpVec.set(ply.getPos().x, ply.getPos().y, ply.getPos().z);
    TheGame.cam.project(TheGame.tmpVec);
    TheGame.fontArialM.draw(TheGame.spriteBatch, ply.name, TheGame.tmpVec.x, TheGame.tmpVec.y, 0, Align.center, false);
}

ध्यान दें कि कैमरे के पीछे की चीजों को पकड़ने के अन्य तरीके हैं जो आपके लिए अधिक कुशल हो सकते हैं।

1
bornander 10 जिंदा 2021, 21:22
1
यह कमाल का जन्मदाता है। धन्यवाद। मैं सिर्फ एक लाइन बदलता हूं और अब सब कुछ ठीक है: if(ply.isAlive && TheGame.cam.frustum.pointInFrustum(ply.getPos()))
 – 
allyozturk
12 जिंदा 2021, 14:13
"ध्यान दें कि कैमरे के पीछे की चीज़ों को पकड़ने के अन्य तरीके हैं जो आपके लिए अधिक कुशल हो सकते हैं।" अब मुझे आश्चर्य है कि, क्या यह तरीका महंगा है? क्या मुझे इसे सीधे अपने खेल में इस्तेमाल करना चाहिए या बेहतर तरीके की तलाश करनी चाहिए?
 – 
allyozturk
12 जिंदा 2021, 14:21
1
आप जो कर रहे हैं उसके लिए यह काफी तेज़ है। मैंने अभी उस टिप्पणी को यह इंगित करने के लिए जोड़ा है कि मेरा उत्तर इस बारे में है कि आपका पाठ दो बार क्यों प्रस्तुत किया गया और सही इष्टतम समाधान के बारे में नहीं। शायद टिप्पणी को ईमानदार होने के लिए छोड़ देना चाहिए था, यह वास्तव में उत्तर में बहुत कुछ नहीं जोड़ता है।
 – 
bornander
12 जिंदा 2021, 21:55
हां। समझ गया। एक बार फिर धन्यवाद।
 – 
allyozturk
13 जिंदा 2021, 22:15