GlLoadIdentity () OpenGL'de ne yapar?


132

OpenGL'de yeniyim ve kodumdaki tüm rastgele işlevlerden biraz bunalmış durumdayım. Çalışıyorlar ve onları ne zaman kullanacağımı biliyorum ama neden onlara ihtiyacım olduğunu veya gerçekte ne yaptıklarını bilmiyorum.

Bunun glLoadIdentity()mevcut matrisi kimlik matrisiyle değiştirdiğini biliyorum , ama bu tam olarak ne yapıyor? Her program gerektiriyorsa, aksi belirtilmedikçe neden kimlik matrisi varsayılan olarak değil? Ne yaptıklarını bilmediğim sürece kodumda işlevler olmasını sevmiyorum. OpenGL'yi yalnızca zengin 2D istemciler için kullandığımı not etmeliyim, bu yüzden bu 3D için çok bariz bir şeyse cehaletimi mazur görün.

Ayrıca glMatrixMode(GL_PROJECTION)VS hakkında biraz kafam karıştı glMatrixMode(GL_MODELVIEW).

Yanıtlar:


139

Özdeşlik matrisi, projeksiyon ve modelgörünüm matrisleri açısından, esasen matrisi varsayılan durumuna geri döndürür.

Umarım bildiğiniz gibi glTranslateve glRotateher zaman matrisin şu anki durumuna bağlıdır. Örneğin, ararsanız glTranslate, matrisin başlangıç ​​noktasından değil, mevcut 'konumundan' çeviri yaparsınız. Ancak, başlangıç ​​noktasından yeniden başlamak istiyorsanız, bu aradığınız zamandır glLoadIdentity()ve o zaman glTranslatebaşlangıçta bulunan matristen veya glRotateşimdi varsayılan yöne yönlendirilmiş olan matristen yapabilirsiniz.

Bence Boon'un cevabı, 1'e eşdeğerdir, tam olarak doğru değil. Matris aslında şuna benzer:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Bu kimlik matrisidir. Boon, matematiksel olarak, bu matrisle çarpılan herhangi bir matrisin (veya buna benzer bir matris; köşegen olanlar, diğer tüm 0'lar) orijinal matrisle sonuçlanacağı konusunda doğrudur, ancak bunun neden önemli olduğunu açıkladığına inanmıyorum.

Bunun önemli olmasının nedeni, OpenGL'nin her matriste tüm pozisyonları ve rotasyonları çarpmasıdır; örneğin bir çokgen ( glBegin(GL_FACE), bazı noktalar glEnd()) çizdiğinizde , onu MODELVIEW ile çarparak "dünya uzayına" çevirir ve ardından PROJECT matrisiyle çarparak onu 3B'den 2B'ye çevirir ve bu da ona piksel çizmek için kullandığı derinlikle (ekran 'kamerasından') birlikte ekrandaki 2B noktalar. Ancak bu matrislerden biri özdeşlik matrisi olduğunda, noktalar özdeşlik matrisi ile çarpılır ve bu nedenle değişmez, dolayısıyla matrisin etkisi olmaz; noktaları tercüme etmez, döndürmez, olduğu gibi bırakır.

Umarım bu biraz daha açıklığa kavuşur!


1
Bu, OpenGL'nin bir 'Ana' veya 'Global' matris tuttuğu ve sonraki her matrisin bu 'Ana' veya 'Global' matrise göre uygulandığı anlamına gelir. Haklı mıyım
user366312

41

Kimlik matrisi sayı için 1'e eşdeğerdir. Bildiğiniz gibi 1 ile çarpılan herhangi bir sayının kendisidir (e.g. A x 1 = A),

Aynı şey matris için de geçerli ( MatrixA x IdentityMatrix = MatrixA).

Yani bir kimlik matrisi yüklemek, matris yığınına daha fazla matris çarpmadan önce matrisinizi doğru duruma getirmenin bir yoludur.

glMatrixMode(GL_PROJECTION) : perspektif dönüşüm veya ortogonal dönüşüm tarafından kullanılan matrislerle ilgilenir.

glMatrixMode(GL_MODELVIEW): model-görünüm dönüşümü tarafından kullanılan matrislerle ilgilenir. Yani, nesnenizi (aka model) görünüm koordinat alanına (veya kamera alanına) dönüştürmek için.


6

Projeksiyon matrisi, izleme hacminizi oluşturmak için kullanılır. Gerçek dünyada bir sahne hayal edin. Çevrenizdeki her şeyi gerçekten görmüyorsunuz, sadece gözleriniz görmenize izin verdiğini. Örneğin bir balıksanız, işleri biraz daha geniş görürsünüz. Dolayısıyla, projeksiyon matrisini kurduğumuzu söylediğimizde, yarattığımız sahneden görmek istediğimiz şeyi kurduğumuzu kastediyoruz. Demek istediğim, dünyanızın herhangi bir yerine nesneler çizebilirsiniz. Görüntüleme biriminin içinde değillerse hiçbir şey görmezsiniz. Görünüm birimini oluşturduğunuzda, görüş alanınızı tanımlayan 6 kırpma düzlemi oluşturduğunuzu hayal edin.

Modelview matrisine gelince, dünyanızdaki modellere (nesnelere) çeşitli dönüşümler yapmak için kullanılır. Bunun gibi, nesnenizi yalnızca bir kez tanımlamanız ve ardından onu çevirmeniz, döndürmeniz veya ölçeklemeniz gerekir.

Görünüm hacmini ayarlamak için sahnenizdeki nesneleri çizmeden önce projeksiyon matrisini kullanırsınız. Ardından nesnenizi çizin ve model görünüm matrisini buna göre değiştirin. Elbette, örneğin bir sahne çizmek ve ardından (bazı yöntemlerle ortografik projeksiyonda daha kolay çalışabileceğiniz) bir metin çizmek istiyorsanız, modellerinizi çizmenin ortasında matrisinizi değiştirebilirsiniz, ardından model görünüm matrisine geri dönebilirsiniz.

Modelview ismine gelince, modelleme ve görüntüleme dönüşümlerinin ikiliğiyle ilgisi var. Kamerayı 5 birim geriye çekerseniz veya nesneyi 5 birim ileri doğru hareket ettirirseniz, esasen aynıdır.

Umarım biraz ışık tutmuşumdur


2

Kimlik matrisi, bir matrisi mantıklı bir varsayılana "başlatmak" için kullanılır.

Anlaşılması gereken önemli bir şey, matris çarpımlarının bir bakıma toplamsal olmasıdır. Örneğin, özdeşlik matrisiyle başlayan bir matris alırsanız, onu bir döndürme matrisiyle çarparsanız, ardından onu bir ölçekleme matrisiyle çarparsanız, sonuçta çarpıldığı matrisleri döndüren ve ölçeklendiren bir matris elde edersiniz.


0

Başkalarının söylediklerini özetlemek gerekirse, kimlik matrisi öyle bir matristir ki, onunla bir vektör / matrisi çarptığınızda, sonuç aynı vektör / matris olur. 1 sayısının çarpma ile veya 0 sayısının toplama ile eşdeğeridir.

glLoadIdentity (), kullanımdan kaldırılmış bir işlevdir ve kendi matrislerinizi yönetmeniz önerilir.


-1

glLoadIdentity() işlevi, projeksiyon moduna her girdiğimizde, matrisin kimlik matrisine sıfırlanmasını ve böylece yeni görüntüleme parametrelerinin bir öncekiyle birleştirilmemesini sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.