2012-01-17 12 views
5

मैं एंड्रॉइड और ओपनजीएल ईएस 2.0 के साथ काम कर रहा हूं और मुझे कोई समस्या है कि मैं वास्तव में एक ठोस प्रश्न में तैयार नहीं हो सकता। छवि में, http://i.imgur.com/XuCHF.png, मैं मूल रूप से बीच में एक जहाज का प्रतिनिधित्व करने के लिए एक आकार है और जब यह पक्ष में स्थानांतरित हो जाता है तो यह गायब बिंदु की तरफ बढ़ जाता है। जो मैं पूरा करना चाहता हूं वह यह है कि जहाज को स्थानांतरित होने पर अपने अधिकांश आकार को बनाए रखना है। मेरा मानना ​​है कि यह मेरे मैट्रिक्स के कारण हो सकता है लेकिन मैंने देखा है कि हर संसाधन एक ही विधि का उपयोग करने लगता है।ओपनजीएल ईएस 2.0 कैमरा मुद्दे

//Setting up the projection matrix 
final float ratio = (float) width/height; 
final float left = -ratio; 
final float right = ratio; 
final float bottom = -1.0f; 
final float top = 1.0f; 
final float near = 1.0f; 
final float far = 1000.0f; 
Matrix.frustumM(projection_matrix, 0, left, right, bottom, top, near, far); 

//Setting the view matrix 
Matrix.setLookAtM(view_matrix, 0, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f); 

//Setting the model matrix 
Matrix.setIdentityM(model_matrix, 0); 
Matrix.translateM(model_matrix, 0, 2f, 0f, 0f); 

//Setting the model-view-projection matrix 
Matrix.multiplyMM(mvp_matrix, 0, view_matrix, 0, model_matrix, 0); 
Matrix.multiplyMM(mvp_matrix, 0, GL.projection_matrix, 0, mvp_matrix, 0); 
GLES20.glUniformMatrix4fv(mvp_matrix_location, 1, false, mvp_matrix, 0); 

shaders के साथ-साथ बहुत ही बुनियादी हैं:

private final static String vertex_shader = 
     "uniform mat4 u_mvp_matrix;" 
    + "attribute vec4 a_position;" 
    + "void main()" 
    + "{" 
    + " gl_Position = u_mvp_matrix * a_position;" 
    + "}"; 

private final static String fragment_shader = 
     "precision mediump float;" 
    + "void main()" 
    + "{" 
    + " gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);" 
    + "}"; 

किसी भी विचार/अंतर्दृष्टि बहुत सराहना कर रहा है।

धन्यवाद।

उत्तर

7

यह सामान्य है - इस तरह परिप्रेक्ष्य प्रक्षेपण दिखना चाहिए। यद्यपि आपके मामले में यह वास्तव में एक चौड़ा दिखता है - दृश्य के विस्तृत क्षेत्र के साथ।

frustumM विधि perspectiveM (projection_matrix, 0, 45.0f, अनुपात, पास, दूर) के बजाय उपयोग करने का प्रयास करें। या यदि आप frustumM का उपयोग करना चाहिए, बाईं/सही/नीचे/इस तरह शीर्ष गणना:

float fov = 60; // degrees, try also 45, or different number if you like 
top = tan(fov * PI/360.0f) * near; 
bottom = -top; 
left = ratio * bottom; 
right = ratio * top; 
+0

इसके लिए धन्यवाद! जब तक मैं इस जवाब से नहीं मिला, तब तक मैं एक सार्थक तरीके से परिप्रेक्ष्य को बदलने का तरीका जानने के लिए अपने सिर पर टक्कर लगी हूं। मैं दृश्य तर्क का क्षेत्र खो रहा था। जब मैंने आपका जवाब देखा तो यूरेका पल था। –

0

आप नहीं है किसी भी परिप्रेक्ष्य प्रभाव सब पर चाहते हैं, तो Matrix.frustumM के बजाय Matrix.orthoM का उपयोग करें।

परिप्रेक्ष्य प्रभाव को कम चरम बनाने के लिए, आपको दृश्य के क्षेत्र को कम करने की आवश्यकता है - यानी, near बढ़ाएं या top और bottom शून्य के करीब लाएं। (शायद आप right = top * ratio चाहते हैं, और इसी तरह left के साथ यदि आप top और bottom मानों के साथ फीड करने जा रहे हैं।)

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