2010-09-25 7 views
12

मैंने विश्व समन्वय पदों के लिए स्क्रीन-कोऑर्डिनेट का बहुत कुछ देखा है, लेकिन विपरीत नहीं देखा है। क्या किसी भी कोण से मुझे 3 डी बिंदु से स्क्रीन निर्देशांक प्राप्त करने का कोई आसान तरीका है?एक 3 डी प्वाइंट से स्क्रीन निर्देशांक कैसे प्राप्त करें? ओपनगल

screen_coordinates = projection_matrix * modelview_matrix * world_coordinates

आपको अपनी ओर से यह कर सकते हैं (विशेष रूप से अगर: मैं सी ++ और ओपन

+0

यह http://stackoverflow.com/questions/724219/how-to-convert-a-3d-point-into-2d-perspective-projection/866749#866749 –

+2

@Mads Elvheim: लगभग लगभग एक सटीक डुप्लिकेट है एक सटीक डुप्लिकेट। यह प्रश्न सी ++ और ओपनजीएल के लिए विशिष्ट है। दूसरा सवाल नहीं है। वास्तव में, अन्य प्रश्न "जावा" टैग किया गया है। –

उत्तर

4

स्क्रीन निर्देशांक उपयोग कर रहा हूँ एक शीर्ष के लिए सिर्फ अपनी प्रक्षेपण और modelview मैट्रिक्स द्वारा गुणा इस तरह के शिखर का एक परिणाम है आप मैट्रिक्स पर कार्रवाई करने के लिए कुछ गणित पुस्तकालय का उपयोग कर रहे हैं) या gluProject उपयोग करते हैं, उदाहरण के लिए:

std::array<GLfloat, 16> projection; 
std::array<GLfloat, 16> modelview; 
std::array<GLfloat, 3> screen_coords; 

glGetFloatv(GL_PROJECTION_MATRIX, projection.data()); 
glGetFloatv(GL_MODELVIEW_MATRIX, modelview.data()); 

gluProject(world_coords[0], world_coords[1], world_coords[2], 
    modelview.data(), projection.data(), 
    screen_coords.data(), screen_coords.data() + 1, screen_coords.data() + 2); 
+1

डाउनवोट। gluProject सही बात करता है, लेकिन आपकी व्याख्या नहीं है। केवल मॉडलव्यू मैट्रिक्स और प्रोजेक्शन मैट्रिक्स के साथ एक बिंदु गुणा करने से आपको क्लिप स्पेस समन्वय मिल जाता है, लेकिन * पहले * डब्ल्यू द्वारा विभाजन। यह आपको स्क्रीन स्पेस समन्वय नहीं देता है। बहबर का जवाब देखें। –

+0

यह निर्णय लेने के लिए कि क्या यह सही स्थान निर्देशांक देता है या नहीं, आपको ओपी के विश्व सेटअप के बारे में अधिक जानकारी चाहिए, उदा। मैं शायद ही कभी अपने 2 डी गेम के लिए व्यूपोर्ट सेटिंग्स का उपयोग करता हूं। लेकिन ऐसा लगता है कि आपकी क्रिस्टल बॉल डाउनवोट के लिए इतनी थैक्स काम करती है :) – erjot

+0

ps। व्यूपोर्ट के लिए ओपनजीएल (फिक्स्ड फंक्शन पाइपलाइन) प्रोजेक्शन मैट्रिक्स कॉन्टैक्शन सेटअप नहीं है? और डब्ल्यू द्वारा स्पष्ट रूप से विभाजित करने के लिए आपको क्या मामलों की आवश्यकता है? जीएलएसएल इसे डिफ़ॉल्ट रूप से कर रहा है। – erjot

20

erjot का जवाब अधूरा है।

खाते में 2 अतिरिक्त चीजें ध्यान में रखी गई हैं।

    homogeneous = P . M . world साथ
  1. , homogeneous वेक्टर सजातीय अंतरिक्ष में एक 4-डी वेक्टर है। विशेष रूप से, इसे वापस [-1: 1]^3 घन में लाने के लिए, आपको homogeneous.w द्वारा अपने पहले 3 निर्देशांक विभाजित करने की आवश्यकता है। cube.x = homogeneous.x/homogeneous.w (कुछ लोग प्रक्षेपण विभाजन को क्या कहते हैं)।
  2. आपको इसके बाद व्यूपोर्ट परिवर्तन लागू करके [-1: 1]^3 घन विंडो समन्वय में बदलने की आवश्यकता है। window.x = viewport.x + viewport.width * (cube.x+1)/2

यदि आप अंतिम जेड की परवाह करते हैं, तो रूपांतरण व्यूपोर्ट के माध्यम से नहीं जा रहा है, बल्कि इसके बजाय गहराई से चल रहा है।

2

एक और बात। याद रखें, gluProject निर्देशांक देता है जहां समन्वय प्रणाली की शुरुआत बाएं कोने में शुरू होती है। स्क्रीन निर्देशांक बाएं शीर्ष कोने पर शुरू होते हैं। स्क्रीन समन्वय के उचित मान प्राप्त करने के लिए y के मान को ओपनजीएल डिवाइस की ऊंचाई से घटाया जाना चाहिए।

क्यूटी GLWidget में उदाहरण के लिए में (0,1,2) दुनिया का समन्वय करता है यह जाता है एक पाठ आकर्षित करने के लिए:

gluProject (0,1,2, modelMatrix, projMatrix, sc.x, sc.y, sc.z); renderText (sc.x, ऊंचाई() - sc.y, "(0,1,2)");

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