2012-06-15 37 views
5

हम एक कोर्स के रूप में एक साधारण 3 डी गेम लिख रहे हैं जिसमें हम विश्वविद्यालय में जाते हैं। (काम के जोड़ों के लिए है) हम JOGL उपयोग करने के लिए है, इसलिए मैं इस API के साथ काम करना होगा (जैसे समाधान: ऐसे java3D के रूप में उच्च स्तर एपीआई के लिए स्विच मेरे लिए अच्छा नहीं होगा ...) वैसे भी, जिस गेम को हमने लागू करने का निर्णय लिया वह एक 3 डी शूटर है। (अब तक का कोड, जिसे हमने उसी पाठ्यक्रम के लिए बनाए गए पिछले असाइनमेंट से फोर्क किया है, यहां पाया जा सकता है: http://code.google.com/p/mirzhcode/source/browse/?repo=cgex4) और अब मैं "विशेष प्रभाव" से निपटने की कोशिश कर रहा हूं। अधिक सटीक, & स्प्राइट (शूटिंग, विस्फोट, आदि के लिए '...) कणों मैं स्प्राइट उत्सर्जक है, जो मैं लागू करना चाहते हैं के बारे में एक व्याख्या भर में आया था: http://bit.ly/KrrPM4जावा + जॉगएल, बनावट बनाते समय सादे काले रंग के बजाय दृश्य में वस्तुओं को दिखाने के लिए ट्रांसपरेंसी कैसे सेट करें?

मैं के साथ बाहर शुरू कर दिया क्या आसान लग रहा था अंश। शॉकवेव रिंग, जो एक तेजी से बढ़ते स्प्राइट से बना है। जब मैं अपनी छवि को खींचने की कोशिश कर रहा हूं, तो मुझे पारदर्शिता की बजाय काले पृष्ठभूमि मिलती है। संरचना छवि एक पारदर्शी PNG फ़ाइल (अल्फ़ा चैनल तो वहाँ है) है shockwave png file with alpha transperancy और क्या मैं इसे से मिलता है: enter image description here कोड मैं इस उत्पन्न करने के लिए प्रयोग किया है:

में

init() विधि:

//loading textures 
try { 
    shockwave = TextureIO.newTexture(new File("textures/shockwave_128X128.png"),false); 
} catch (GLException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

gl.glShadeModel(GL.GL_SMOOTH); 
gl.glClearColor(0f, 0f, 0f, 1f); 
gl.glClearDepth(1.0); 
gl.glEnable(GL.GL_BLEND); 
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE); 
gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); 
gl.glHint(GL.GL_POINT_SMOOTH_HINT, GL.GL_NICEST); 
gl.glEnable(GL.GL_TEXTURE_2D); 
gl.glEnable(GL.GL_DEPTH_TEST); 

//UNCOMMENT THE FOLLOWING LINE OF CODE 
//FOR REALISTIC COLORS. NOTE THAT ICC 
//BUTTON WON'T CHANGE THE COLORS ANYMORE. 

//gl.glEnable(GL.GL_LIGHTING); 

//two (soft) lights (red and blue) setup. 
//each in an opposite corner of the room. 
float color0[] = {1f, 0f, 0f, 0.5f}; 
float ambient0[] = {1.0f, 1.0f, 1.0f, 0.5f}; 
float position0[] = {(float) (0.95*expansionFactor), (float) (0.95*expansionFactor), (float) (0.95*expansionFactor)}; 

float color1[] = {0f, 0f, 1f, 0.5f}; 
float ambient1[] = {1.0f, 1.0f, 1.0f, 0.5f}; 
float position1[] = {(float) (0.95*expansionFactor), (float) (0.95*expansionFactor), (float) (0.95*expansionFactor)}; 

gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient0,1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE,color0 , 1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, color0 , 1); 
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position0, 1); 

gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, ambient1,1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE,color1 , 1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, color1 , 1); 
gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, position1, 1); 

gl.glEnable(GL.GL_LIGHT0); 
gl.glEnable(GL.GL_LIGHT1); 

start(); 

gl.glEnable(GL.GL_BLEND); 
gl.glClear(GL.GL_COLOR_BUFFER_BIT); 
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 
shockwave.bind(); 

gl.glColor4f(1f,1f,1f,1f); 

gl.glBegin(GL.GL_QUADS); 
gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3d(0.0-10, 0.2, 0.0-10); 
gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3d(0.0+10, 0.2, 0.0-10); 
gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3d(0.0+10, 0.2, 0.0+10); 
gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3d(0.0-10, 0.2, 0.0+10); 
gl.glEnd(); 

सु करने के लिए:

और भी display() विधि में मैं इसे समझता हूं, मेरा सवाल यह है कि मैं अपने अल्फा चैनल, का उपयोग करने के लिए बनावट कैसे प्राप्त करूं और यदि यह इतना आसान नहीं है, तो क्या ऐसी लाइब्रेरी है जिसे आप जानते हैं जिसका मैं उपयोग कर सकता हूं?

उत्तर

3

थोड़ा और खोदने के बाद, मुझे एहसास हुआ कि मुझे क्या करना है। गारंटी है, जब आप ओपनजीएल के साथ छवियों को मिश्रित करते हैं, तो यह अब तक प्रदान किए गए फ्रेम में मिश्रित है। इसलिए ड्राइंग का क्रम महत्वपूर्ण है। मैंने डिस्प्ले विधि की शुरुआत में इस छवि को प्रस्तुत किया, और मुझे इसे अंत में रखना चाहिए था। तो वैसे भी, अगर कोई यह जानना चाहता है कि पारदर्शी वस्तुओं को कैसे आकर्षित किया जाए, तो सुनिश्चित करें कि आप उन्हें अंतिम रूप से आकर्षित करते हैं। संख्यात्मक पारदर्शी वस्तुओं के मामले में, आपको इसे क्रम में आकर्षित करना होगा। कैमरे से आगे दूर खींचा जाना चाहिए। after the fix