2009-07-11 13 views
15

मेरे पास दो मॉडल हैं, ए और बी, और एक प्रकाश, एल। मैं मॉडल बी पर एक छाया डालने के लिए मॉडल ए चाहता हूं। मैं इस समय के लिए छाया वॉल्यूम्स या उचित छाया से परेशान नहीं होना चाहता, बस एक साधारण सर्कल छाया पर्याप्त होगी। प्रभाव यह है कि मॉडल ए को छाया कास्टिंग उद्देश्यों के लिए एक क्षेत्र के रूप में माना जाता है।मैं ओपनजीएल में सस्ते छाया कैसे बना सकता हूं?

मॉडल बी में प्रत्येक त्रिकोण के लिए, त्रिकोण आकर्षित:

यहाँ कैसे मैं एल्गोरिथ्म कल्पना है। एल से ए की रेखा के साथ त्रिकोण पर एक सर्कल प्रोजेक्ट करें, त्रिभुज कितनी दूर है इस पर निर्भर करता है कि सर्कल का आकार बढ़ रहा है। सुनिश्चित करें कि सर्कल त्रिकोण की सीमाओं पर चिपक गया है (किसी भी तरह से स्टैंसिल बफर का उपयोग करके, मुझे कल्पना है)।

मैं ओपन और सादे सी

कुछ संदर्भ प्रलेखन मैं पढ़ सकते हैं पर कोई संकेत के साथ काम कर रहा हूँ? या प्रत्यारोपण विचार?

उत्तर

9

मुझे लगता है कि सही छाया को लागू करना वास्तव में आसान है क्योंकि ओपनजीएल आपके लिए काम कर सकता है। एक विशेष मैट्रिक्स के साथ तो पहले सामान्य रूप से: दो बार http://www.opengl.org/resources/code/samples/mjktips/TexShadowReflectLight.html

कोड ऊपर वस्तु प्रस्तुत करता है:

मैं यहाँ प्रलेखन के बहुत सारे के साथ एक काम कर छाया कोड मिला। यह बहुत से असंबंधित चीजें करता है जैसे कि माउस और प्रतिबिंबों के साथ नियंत्रण। तो यहां दिलचस्प भाग हैं।

/* Create a matrix that will project the desired shadow. */ 
void 
shadowMatrix(GLfloat shadowMat[4][4], 
    GLfloat groundplane[4], 
    GLfloat lightpos[4]) 
{ 
    GLfloat dot; 

    /* Find dot product between light position vector and ground plane normal. */ 
    dot = groundplane[X] * lightpos[X] + 
    groundplane[Y] * lightpos[Y] + 
    groundplane[Z] * lightpos[Z] + 
    groundplane[W] * lightpos[W]; 

    shadowMat[0][0] = dot - lightpos[X] * groundplane[X]; 
    shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y]; 
    shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z]; 
    shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W]; 

    shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X]; 
    shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y]; 
    shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z]; 
    shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W]; 

    shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X]; 
    shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y]; 
    shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z]; 
    shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W]; 

    shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X]; 
    shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y]; 
    shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z]; 
    shadowMat[3][3] = dot - lightpos[W] * groundplane[W]; 

} 

मैं यह पूरी तरह से समझने के लिए बहाना नहीं है:

यह छाया मैट्रिक्स गणना करता है। लाइटपोज़ प्रकाश स्रोत की स्थिति है। ग्राउंडप्लेन के पहले 3 निर्देशांक जमीन की सतह के सामान्य वेक्टर हैं। चौथा ऑफसेट है (यह 0,0,0 से कितना दूर है)।

glPushMatrix(); 
/* Project the shadow. */ 
glMultMatrixf((GLfloat *) floorShadow); 
drawDinosaur(); 
glPopMatrix(); 

वहाँ कुछ चीजें आप glEnable/glDisable पहले इस बात के लिए की जरूरत है ताकि काम लिंक को देखने के लिए कर रहे हैं:

और यह हिस्सा वास्तव में छाया बना देता है।

+4

यह मॉडल को एक विमान पर "flattens" .. एक सपाट सतह पर एक छाया प्रक्षेपित करने के लिए अच्छा है। ओपी एक मनमाने ढंग से आकार के 3 डी ऑब्जेक्ट पर छाया प्रस्तुत करना चाहता है। –

+0

यह माना जा सकता है कि: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=27 दुर्भाग्यवश मैं इसे जीसीसी के साथ संकलित नहीं कर सकता। – stribika

+0

यह विधि अच्छी लगती है, लेकिन बी में प्रत्येक चेहरे के लिए एक बार स्रोत मॉडल ड्राइंग की लागत अधिक दिखाई देती है। क्या इस विधि की जटिलता को कम करने का कोई तरीका है? – Martin

0

This paper विस्तृत छाया मानचित्र बनाने के लिए ओपनजीएल और हार्डवेयर त्वरण का उपयोग करके आपकी आवश्यकताओं को पूरा करने लगता है।

अगर मैं इसे पूरा करने की कोशिश कर रहा था, तो मैं रे कास्टिंग का उपयोग करने के लिए लुभाना चाहूंगा। बी में प्रत्येक त्रिभुज के लिए, त्रिभुज से प्रकाश में एक वेक्टर बनाएं। अगर यह रास्ते में कुछ भी हिट करता है, तो यह छाया में है। यह तब तक धीमा होगा जब तक आप एक सभ्य त्वरण संरचना और तेज़ त्रिकोण हिट टेस्ट का उपयोग नहीं कर रहे थे। मुझे bounding volume hierarchies पसंद है; कई कार्यक्रम टकराव का पता लगाने के लिए भी उनका उपयोग करते हैं।

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