2011-05-23 13 views
6

OpenGL'de bir oblik (cavalier) projeksiyonu oluşturmak istiyorum. Bu işlemin varsayılan olarak desteklenmediğini biliyorum ve bunun yerine bir Shear Matrix'e ihtiyacım var ve bir Ortogonal Projeksiyon yapmam gerekiyor.opengl oblique projeksiyon

ben yapmak zorunda OpenGL adım/işlevleri nelerdir söyleyebilir?

cevap

13
yani o

GLfloat custrom_projection[16] = { 
    ... 
}; 
glMatrixMode(GL_PROJECTION); 
glLoadMatrix(custom_projection); 

OpenGL dizinler, kolon büyük amacıyla matris elemanlarını kullanarak yük, her bir boyutta 1 arasında -1 haline gelen köşe eşlemek için arzu edilen projeksiyon matris Construct

Daha önce eğik/şövalye projeksiyon kullanılmaz ettik, ancak aşağıdaki size devam etmek için nasıl bir fikir vermelidir:

bir 4x4 makaslama matrisi oluşturma

X kesme olmak

θ, Φ Y kesme olmak ve Z, yalnız bırakılmıştır. senin ortografik projeksiyon tarafından,

| 2/(r-l),  0,  0, -(r+l)/(r-l) | 
| 0, 2/(t-b),  0, -(t+b)/(t-b) | 
| 0,  0, 2/(f-n), -(f+n)/(f-n) | 
| 0,  0,  0,   1  | 

(uzak yakın, sol, sağ, alt, üst, tarafından tarif ve) o

(ref: slide 11 of http://www.cs.unm.edu/~angel/CS433/LECTURES/CS433_17.pdf)

Çarp

(ref: http://en.wikipedia.org/wiki/Orthographic_projection_%28geometry%29)

OpenGL daha sonra fonksiyonuile (16 yüzen bir dizi olarak) doğrudan bu matris yüklemek için izin verir: görüntüleme ve dönüşümler OpenGL'de nasıl çalıştığını derinliği bakışta bir fazlası için

GLfloat proj[16] = { ... }; 
glMatrixMode(GL_PROJECTION); // Make sure we're modifying the *projection* matrix 
glLoadMatrixf(proj);   // Load the projection 

, ben Chapter 3 of the OpenGL "Red Book" sevk ediyorum. Ortografik bir projeksiyon oluşturmak ve uygulamak için glOrtho() kullanıyorlar.

Düzenleme: datenwolf gibi

işaret, OpenGL'de matris elemanları sütun ana sırayla belirtilen akılda ayı.

6

OpenGL, isteğe bağlı yansıtma matrislerini belirtmenize izin verir. da

0 4 8 12 
1 5 9 13 
2 6 10 14 
3 7 11 15 
0

Eğik izdüşümü, projeksiyon düzlemini sağdan uzağa belirli bir açıyla döndürerek elde edildiğinden, döndürme ekseni boyunca uzatılmış bir görüntüden başka bir şey üretmez, sanırım normal dikdörtgeni ölçeklemek yeterlidir. Bu eksen boyunca izdüşümü, \csc\theta faktörü ile. Bu iddia trigonometri eşitlikleri, örneğin \sin\theta+\cos\theta \cot\theta=\csc\theta ile kanıtlanabilir. senin eğik projeksiyon Luke'un yanıtında gibi \theta ve \phi tarafından belirtilirse, eksen açısı bu iki açıdan, diyelim ki, \arctan(\tan\theta\sqrt(1+\cot^2\phi)) dayalı bir trigonometri egzersizi olarak hesaplanabilir.