2013-11-02 4 views
5

मुझे होमवर्क करना होगा और मैं एक फंक्शन को लागू करने का प्रयास करता हूं। मैंने कई तरीकों से कोशिश की लेकिन मुझे एकमात्र परिणाम मिला नीली स्क्रीन है। मेरा बाकी कार्यक्रम बहुत काम करता है, वास्तव में अगर मैं glm :: look का उपयोग करता हूं तो सब अच्छा है। यह मेरा कोड है:LookAt फ़ंक्शन: मैं पागल हो रहा हूं

mat4 Transform::lookAt(const vec3 &eye, const vec3 &center, const vec3 &up) 
{ 
    vec3 w(glm::normalize(eye - center)) ; 
     vec3 u(glm::normalize(glm::cross(up, w))); 
     vec3 v(glm::cross(w, u)) ; 
    mat4 ret = mat4 (
     vec4 (u.x,v.x,w.x,0), 
      vec4 (u.y,v.y,w.y,0), 
      vec4 (u.z,v.z,w.z,0), 
     vec4 (-u.x*eye.x-u.y*eye.y-u.z*eye.z, 
      -v.x*eye.x-v.y*eye.y-v.z*eye.z, 
      -w.x*eye.x-w.y*eye.y-w.z*eye.z, 
      1) 
    ); 
    return ret; 

उत्तर

9

मैं तुम्हें मैट्रिक्स के संचालन के लिए GLM लाइब्रेरी का उपयोग देखा है, तो GLM कोड से lookAt कार्यान्वयन इस तरह दिखता है:

mat4x4 lookAt(vec3 const & eye, vec3 const & center, vec3 const & up) 
{ 
    vec3 f = normalize(center - eye); 
    vec3 u = normalize(up); 
    vec3 s = normalize(cross(f, u)); 
    u = cross(s, f); 

    mat4x4 Result(1); 
    Result[0][0] = s.x; 
    Result[1][0] = s.y; 
    Result[2][0] = s.z; 
    Result[0][1] = u.x; 
    Result[1][1] = u.y; 
    Result[2][1] = u.z; 
    Result[0][2] =-f.x; 
    Result[1][2] =-f.y; 
    Result[2][2] =-f.z; 
    Result[3][0] =-dot(s, eye); 
    Result[3][1] =-dot(u, eye); 
    Result[3][2] = dot(f, eye); 
    return Result; 
} 

आप पहली बार वैक्टर आप का उपयोग करेगा सामान्य (एफ वह दिशा है जिसे आप देखते हैं, u ऊपर और एस सही वेक्टर है)। तो सुनिश्चित करें कि वेक्टर अप दिशा और सही वैक्टर आप अपने पार उत्पाद के रूप में यह पुनर्गणना, क्योंकि जब आप एक ऊपर वेक्टर देना क्या आप वाकई इसकी सीधा आंखों के लिए नहीं कर सकते करने के लिए खड़ा है बनाने के लिए -center वेक्टर (देखें दिशा), वे सिर्फ एक विमान बनाते हैं जो आपको दाएं वेक्टर देता है।

मैट्रिक्स इनका निर्माण किया गया है। अधिक जानकारी के लिए यह कैसे काम करता है http://www.songho.ca/opengl/gl_transform.html पृष्ठ की जांच करता है। संक्षेप में: यह एक मैट्रिक्स है जो आपको एक नई समन्वय प्रणाली बनाता है, इसलिए coloumns axises हैं। फिर अंतिम coloumn पर अनुवाद मैट्रिक्स लागू किया जाता है।

(पहचान मैट्रिक्स को देखो:

AXIS  TRANSFORM 
x y z transl. 
1, 0, 0, 0 
0, 1, 0, 0, 
0, 0, 1, 0 
0, 0, 0, 1 

यह आपको कोई अनुवाद के साथ समन्वय प्रणाली मानक देता है।)

तो फिर तुम प्रक्षेपण और मॉडल matrixes (पी * वी * मी) के साथ इस गुणा , आदेश महत्वपूर्ण है। जब आप अपना कार्यान्वयन लिखते हैं तो सुनिश्चित करें कि आप ओपनग्लू के कारण कॉलमैन प्रमुख मैट्रिक्स का उपयोग करते हैं, या उन्हें ट्रांसफर करते हैं।

मुझे उम्मीद है कि यह मदद करता है।

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