Neden kamera yerine dünyayı hareket ettiriyoruz?


87

Bir OpenGL oyununda oyuncunun hareket etmesini sağlamak için yaptığımız şeyin kamerayı hareket ettirmek değil, tüm dünyayı hareket ettirmek olduğunu duydum.

Örneğin, bu yazının özü: OpenGL View matrix

Gerçek hayatta, kamerayı belirli bir sahnenin görüntüsünü değiştirmek için hareket ettirmeye alışkınsınız, OpenGL'de bunun tam tersi geçerli. OpenGL'deki kamera hareket edemez ve negatif Z yönüne bakacak şekilde (0,0,0) bulunacak şekilde tanımlanır. Bu, kamerayı hareket ettirmek ve döndürmek yerine, uygun görünümü oluşturmak için dünyanın kamera etrafında hareket ettirildiği ve döndürüldüğü anlamına gelir.

Neden bunu yapıyoruz?


1
Bir kamera, bir projeksiyon görünümünden başka bir şeyi temsil etmez. Demek istediğin izdüşümü elde etmek için dünyayı değiştiriyorsun. Kavramı garip, ama aslında mantıklı ... bir şekilde ... sanırım
Sidar

@sharethis, cevabımı daha iyi bir açıklama ile geliştirdim. Matematik ve 3D Kamera (Sanal Kamera) seçeneği ile projeksiyon perspektif eklendi. Siz ve başkaları için yardımcı olabilir.
Md Mahbubur Rahman

4
Bu aslında doğru değildir, çünkü her iki işlem de (kamerayı hareket ettirmek veya dünyadaki nesneler) simetrik olduğundan, hangi işlemin gerçekleştiğini söylemenin bir yolu yoktur. Dünyayı kamera hakkında hareket ettirmeyi düşünüyorsun, ama aynı zamanda bir başkası kamerayı dünya hakkında tersine hareket ederek görselleştirebilir ... Tamam, yani nesneleri birbirine göre hareket ettirebilirsin, bu yüzden bir yol daha sezgisel olabilir, ama ikisi de değil. kişi "yanlıştır", durumu görselleştirmenin her iki yolu da farklı durumlarda iyidir. Genellikle her ikisini de düşünmek faydalı olur.
user3728501

Yanıtlar:


72

Neden ?

Çünkü, bir kamera projeksiyon görüntüsünü temsil eder.

Ancak 3D Kamera durumunda (Sanal Kamera), kamera dünya yerine hareket eder. Bu cevaptan sonra ayrıntılı bir açıklama yaptım.

Matematiksel Anlamak

Projeksiyon Görünümü uzayda hareket eder ve yönünü değiştirir. Dikkat edilmesi gereken ilk şey, ekranda istenen projeksiyonun görüş yönü ile değişmediğidir.

Bu nedenle, istenen projeksiyonu elde etmek için başka şeyleri dönüştürürüz.

Http://opengl.org adresinden anlamak

Kamerayı hareket ettirmek için OpenGL uygulamanızın sahneyi kamera dönüşümünün tersi yönde hareket ettirmesi gerekir. OpenGL söz konusu olduğunda kamera yoktur. Daha spesifik olarak, kamera her zaman göz boşluğu koordinatında bulunur (0, 0, 0)

Http://open.gl adresinden anlama

Ayrıca, aşağıdaki satırları http://open.gl/transformations sayfasının Görünüm matrisi kısmından paylaşmak istiyorum

Bir kamera dönüşümünü simüle etmek için, aslında dünyayı bu dönüşümün tersi ile dönüştürmek zorundasınız. Örnek: Kamerayı yukarı taşımak istiyorsanız, dünyayı aşağıya çekmek zorundasınız.

Perspektifle anlama

Gerçek dünyada, olayları "perspektif" denilen bir şekilde görüyoruz.

Perspektif, uzaktaki nesnelerin size daha yakın olanlardan daha küçük göründüğü kavramını ifade eder. Perspektif ayrıca düz bir yolun ortasında oturuyorsanız, yolun sınırlarını iki yakınsak çizgi olarak gördüğünüz anlamına gelir.

Bu bakış açısı. Perspektif, 3B projelerde kritik öneme sahiptir. Perspektif olmadan, 3D dünyası gerçek görünmüyor.

Bu doğal ve açık görünse de, bir bilgisayarda bir 3B oluşturma oluşturduğunuzda, bir 2B yüzey olan bilgisayar ekranında bir 3B dünyayı simüle etmeye çalıştığınızı düşünmeniz önemlidir.

Bilgisayar ekranının arkasında gerçek bir 3B sahne olduğunu ve bilgisayar ekranınızın "camı" ndan izlediğinizi hayal edin. Bakış açısını kullanarak hedefiniz, ekranınızın bu “camına” yansıtılan şeyleri ekranın arkasında gerçek bir 3B dünya varmış gibi yapan bir kod oluşturmaktır. Tek uyarı, bu 3B dünyanın gerçek olmadığı… Bu sadece 3B dünyanın matematiksel bir simülasyonudur.

Dolayısıyla, bir sahneyi 3D olarak simüle etmek için 3B oluşturmayı kullanırken ve 3D sahneyi ekranınızın 2B yüzeyine yansıtırken, işleme perspektif yansıtma denir.

Ne elde etmek istediğinizi sezgisel olarak düşünerek başlayın. Bir nesne görüntüleyiciye daha yakınsa, nesnenin daha büyük görünmesi gerekir. Nesne daha uzaktaysa, daha küçük görünmesi gerekir. Ayrıca, bir nesne izleyiciden uzaklaşıyorsa, düz bir çizgide, uzaklara doğru uzaklaştıkça ekranın ortasına doğru birleşmesini istersiniz.

Perspektifi matematiğe çevirme

Çizimi aşağıdaki şekilde görüntülerken, 3B sahnenize bir nesnenin yerleştirildiğini hayal edin. 3B dünyasında, nesnenin konumu, başlangıç ​​noktasında göz noktasında bulunan 3B koordinat sistemine atıfta bulunarak, xW, yW, zW olarak tanımlanabilir. Nesnenin gerçekte, ekranın dışındaki 3B sahnesinde konumlandırıldığı yer burasıdır.

görüntü tanımını buraya girin

İzleyici bu nesneyi ekranda izlerken, 3D nesnesi, ekranın 2D koordinat sistemine (projeksiyon düzlemi) başvuran xP ve yP olarak tanımlanan bir 2D konumuna "yansıtılır".

Bu değerleri matematiksel bir formüle koymak için, dünya eksenleri için 3B koordinat sistemi kullanacağım, burada x ekseni sağa, y noktalara ve pozitif z noktalarına ekran içinde işaret ediyor. 3B başlangıç, izleyicinin gözünün konumunu belirtir. Bu yüzden, ekranın camı z eksenine dik olan (dik açıda) bir düzlem üzerinde, bazı z'de zProj diyeceğim.

Öngörülen xP ve yP pozisyonlarını, xW ve yW dünya pozisyonlarını zW ile bölerek hesaplayabilirsiniz:

xP = K1 * xW / zW
yP = K2 * yW / zW

K1 ve K2, projeksiyon düzleminizin en boy oranı (görüş alanınız) ve geniş açılı görüş derecesini hesaba katan gözünüzün "görüş alanı" gibi geometrik faktörlerden elde edilen sabitlerdir.

Bu dönüşümün perspektifi nasıl simüle ettiğini görebilirsiniz. Ekranın kenarlarına yakın olan noktalar, göze olan mesafe (zW) arttıkça merkeze doğru itilir. Aynı zamanda, merkeze (0,0) yakın olan noktalar göze olan uzaklıktan çok daha az etkilenir ve merkeze yakın kalır.

Z'nin bu bölümü, ünlü “perspektif bölünmesi” dir.

Şimdi, 3B sahnedeki bir nesnenin bir dizi tepe noktası olarak tanımlandığını düşünün. Böylece, bu tür bir dönüşümü tüm geometri köşelerine uygulayarak, nesnenin göz noktasından uzaktayken büzülmesini sağlarsınız.

Diğer Önemli Durumlar

  • 3D Kamera durumunda (Sanal Kamera), kamera dünya yerine hareket eder.

3D kameraları daha iyi anlamak için bir film çektiğinizi hayal edin. Çekim yapmak istediğiniz bir sahne ayarlamak zorundasınız ve bir kameraya ihtiyacınız var. Çekim yapmak için, sahnedeki nesneleri farklı açılardan ve bakış açılarından çekerek, kameranızla sahnede dolaşacaksınız.

Aynı çekim işlemi bir 3D kamera ile gerçekleşir. Oluşturduğunuz "sanal" sahnenin etrafında dolanabilecek bir "sanal" kameraya ihtiyacınız var.

İki popüler çekim stili, dünyayı bir karakterin gözünden (aynı zamanda birinci şahıs kamerası olarak da bilinir) kullanarak izlemeyi veya kamerayı bir karakterde göstermeyi ve onları görmeyi (üçüncü şahıs kamerası olarak bilinir) içerir.

Bu, bir 3D kameranın temel öncülüdür: bir 3D sahnesinde dolaşmak ve görüntüleri belirli bir bakış açısıyla yapmak için kullanabileceğiniz sanal bir kamera.

Dünya mekanını anlamak ve mekanı incelemek

Bu tür davranışları kodlamak için, 3B dünyasının içeriğini, yalnızca dünya koordinat sistemi bakış açısıyla değil, başka bir sabit bakış açısından da kameranın bakış açısıyla oluşturacaksınız.

Genel olarak konuşursak, bir 3D sahnesinde bir dizi 3D model bulunur. Modeller, kendi koordinat sistemlerine atıfta bulunulan bir dizi köşe ve üçgen olarak tanımlanır. Modellerin tanımlandığı alana model (veya yerel) alan denir.

Model nesnelerini 3B sahneye yerleştirdikten sonra, bu modellerin köşelerini bir "dünya dönüşümü" matrisi kullanarak dönüştürürsünüz. Her nesnenin, nesnenin dünyanın neresinde olduğunu ve nasıl yönlendirildiğini tanımlayan kendi dünya matrisi vardır.

Bu yeni referans sistemine "dünya alanı" (veya global alan) denir ve onu yönetmenin basit bir yolu, bir dünya dönüşüm matrisini her nesneye ilişkilendirmektir.

Bir 3D kameranın davranışını uygulamak için ek adımlar atmanız gerekir. Dünyaya - dünya menşeine değil - ancak 3D kameranın kendisinin referans sistemine referans vereceksiniz.

İyi bir strateji, kamerayı 3B dünyasında gerçek bir 3B nesne olarak ele almayı içerir. Diğer tüm 3B nesnelerde olduğu gibi, fotoğraf makinesini 3B dünyasında istenen konuma ve yönde yerleştirmek için bir "dünya dönüşümü" matrisi kullanırsınız. Bu kamera dünyası dönüşümü matrisi, kamera nesnesini orijinalden ileriye dönük (z ekseni boyunca), gerçek dünyaya (xc, yc, zc) ve dünya dönüşüne dönüştürür.

Aşağıdaki şekil Dünya (x, y, z) koordinat sistemi ve Görünüm (kamera) (x ', y', z ') koordinat sistemi arasındaki ilişkileri göstermektedir.

görüntü tanımını buraya girin


5
Diğer cevaplar orada. Onları kendi düzeninize eklemenize gerek yok.
Jesse Dorsey

1
@Noctrine, Teşekkürler. Sayfalar arası bağlantıyı nasıl oluşturacağımı bilmiyordum.
Md Mahbubur Rahman,

"Bir sonraki bölümde, bu perspektif projeksiyon formülünü Flash 3D projelerinizde kullanabileceğiniz ActionScript olarak kullanacaksınız." Orijinal soruda bir Flash 3D projesinden bahsedilmediği için, bu bana kaynaklarınızı aktarırsanız, bunu başka bir yerden kopyaladığınızı düşündürüyor.
Gilles

@ Gilles, Benim hatam için üzgünüm. Cevabımı düzenledim. Cevabı birkaç kaynak çalışarak hazırladım. Ve belirttiğiniz gibi size çok teşekkürler. :)
Md Mahbubur Rahman,

Burada belirtilen glMatrixMode()birkaç fonksiyona dikkat edin: eng.utah.edu/~cs6360/Lectures/frustum.pdf ve opengl.org/archives/resources/faq/technical/viewing.htm kullanımdan kaldırılmıştır. Ancak matematiksel açıklama doğru ve faydalı kalır.
patryk.beza

28

Mahbubar R Aaman'ın cevabı oldukça doğru ve sağladığı bağlantılar matematiği doğru bir şekilde açıklıyor, ancak daha az teknik / matematiksel bir cevap istiyorsanız, farklı bir yaklaşım deneyeceğim.

Gerçek dünyadaki ve oyun dünyasındaki nesnelerin konumları bazı koordinat sistemi ile tanımlanır. Bir koordinat sistemi, konum değerlerine anlam kazandırır. Eğer bu sayıların ne anlama geldiğini bilmediğiniz sürece size yardımcı olmayacak "100,50" de olduğumu söylersem (mil, kilometre, enlem ve boylam, vb.). Kartezyen koordinatlarsa ("normal" tür koordinatlar), hangi kökene göre olduklarını bilmeniz gerekir; "Doğu’ya 100 metre uzaktayım" dersem , koordinat orijini denilen " Neyin doğusunda" olduğunu bilmeniz gerekir .

Bunu düşünmenin kolay bir yolu var. Birine "tren istasyonu 3 km kuzeyde ve kentin güneybatı köşesinin 1.5 kilometre doğusunda" diyebilirsiniz. Ayrıca birine "tren istasyonu şu an bulunduğum yerin tam 1 kilometre kuzeyindedir" diyebilirsiniz. Her iki koordinat da doğrudur ve aynı dönüm noktasının konumunu belirler, ancak farklı bir kaynaktan ölçülürler ve bu nedenle farklı sayısal değerlere sahiptirler.

Bir 3D uygulamasında, genellikle bazı tasarımcı tarafından belirlenmiş bir orijinli (genellikle hangi seviyenin merkezinde) Kartezyen koordinatlarıyla ölçülen, kameradaki ve oyundaki nesnelerin konumunu temsil eden bir "dünya" koordinat sistemi vardır. veya oynadığınız harita). Oyunda, başlangıçta kamera bulunan Kartezyen koordinat sistemi gibi diğer koordinat sistemleri de var. Herhangi bir yeni koordinat sistemini istediğiniz zaman istediğiniz şekilde tanımlayabilirsiniz ve bu, matematik için işleri kolaylaştırmak için 3D simülasyonda çok sık yapılır.

Gerçekte ekranınıza bireysel bir üçgen oluşturan algoritma belirli bir şekilde çalışır ve bu nedenle oluşturma sırasında doğrudan dünya koordinatlarıyla çalışmak uygun değildir. Matematik, “nesne dünyanın merkezinin sağında 100 birimdir” gibi bilgilerle başa çıkacak kadar kurulmadı. Bunun yerine matematik “nesne doğrudan kameranın önünde ve 20 birim uzakta” ​​ile çalışmak istiyor. Bu nedenle, nesne dünyasındaki pozisyonları almak ve bunları kamera koordinat sistemine çevirmek için oluşturma matematiğine ek bir adım eklenir.

Tabii kamera da bir konum ve yönelime sahip. Bu nedenle, bir nesne 20,100,50 konumunda ve kamera 10,200, -30 konumundaysa, nesnenin kameraya göre konumu 10,100,80'dir (nesnenin konumu eksi kameranın konumu). Kamera bir oyunda hareket ettiğinde, dünya koordinatlarındaki kamera konumu tam beklediğiniz gibi hareket eder.

Nesneleri unutmayın değil hareket; Daha önce oldukları yerde kalıyorlar. Bununla birlikte, konumları şimdi farklı bir koordinat orijinine göre ifade edilmektedir. Nesnenin dünya koordinatları yalnızca nesnenin kendisi hareket ederse hareket eder, ancak kamera koordinatları da kamera hareket ettiğinde değişir, çünkü bunlar kameranın konumuna bağlıdır.

Ayrıca, alıntı yaptığınız öğreticiden gelen tanımlamanın basitleştirilmiş bir açıklama olduğunu ve mutlaka OpenGL’in yaptıklarının kesin bir açıklaması olmadığını unutmayın. Makalenin yazarının bunu anlamadığını sanmıyorum; Yazar, bu durumda onu ortadan kaldırmak yerine karışıklığa neden olan basitleştirilmiş bir analoji kullanmaya çalıştı.

Eğer matematiğin kamera koordinatlarını neden umursadığını anlamaya yardımcı olursa, bu alıştırmayı deneyin: bir dikdörtgen yapmak için ellerinizi başparmaklarınızla ve işaretçilerinizle bir araya getirin (bir "görünüm portu" diyelim) ve aradığınız odaya bakın. Bir nesne bulun ve ona bakın, sonra etrafa bakın ama doğrudan ona değil. Bunu yaptığınızda, kendinize "görünüm alanımdaki nesne nerede?" Bu nesnenin Dünya üzerindeki yerini tam olarak belirlemek için kullanabileceğiniz bazı gerçek dünya boylamları ve enlemleri var, ancak bu, gördükleriniz hakkında hiçbir şey ifade etmiyor. "Nesne, görünüm alanımın sol üst köşesinde ve yaklaşık 2 metre uzaklıkta görünüyor" diyerek, size birazcık anlatılıyor. Başınıza ve yönünüze göre bir koordinat sistemi yarattınız. Bir nesnenin vizyonunuza göre nerede olduğunu tanımlayana bakıyoruz. Temelde OpenGL / Direct3D'nin üçgen rasterleştirici kısmının ihtiyacı budur ve matematiğin nesne konumlarının ve yönelimlerinin uygun dünya koordinatlarından kamera koordinatlarına dönüştürülmesini istediği şey budur.


Benim için matematiksel açıklama açık ve anlaşılabilir olsa da, bu aynı zamanda harika bir açıklama! Aynı soruya başkalarına yardım ettiğinizi düşünüyorum.
danijar

Kameranın hareket edip etmediğini veya dünyanın sadece bahsettiğiniz koordinat sisteminin bir işlevi olup olmadığını netleştirmek için +1.
David Moles

11

Sadece diğer ikisine ekleyerek (mükemmel), Mahbubur R Aaman'ın dokunduğu bir noktaya biraz daha ayrıntılı cevap veriyor: “kamera yok”.

Bu oldukça doğrudur ve ortak “kamera” analojisinin başarısızlığını temsil eder, çünkü “kamera” aslında yoktur. Kamera analojisinin tam olarak böyle olduğunu anlamak önemlidir - analoji. Olayların gerçekte sahnelerin gerisinde nasıl çalıştığını tarif etmiyor (veya tarif ediyormuş gibi yapıyor).

Bu yüzden inceleyin (amaçlanan), eğer sizin için yeniyse, kafanızı bu konuya sokmanıza yardımcı olmak için bir araç olarak görür, ancak her zaman bunun sadece bir yardımcı olduğunu ve olayların gerçekte olduğu gibi herhangi bir açıklama olmadığını unutmayın.

Şimdi, burada alakalı iki nesne sınıfınız var: bakış açısı ve dünyadaki her şey. Görünüm noktasını bazı nesnelere yaklaştırmak istiyorsunuz, ancak bu hareket için sonuç, görünümün nesnelere daha yakın hareket etmesi veya nesnelerin görünüme daha yakın hareket etmesi ile aynı. Tek yaptığın, aralarındaki mesafeyi değiştirmek; mevcut mesafe X olduğundan ve yeni mesafenin Y olmasını istediğiniz için, hangisinin hareket ettiği önemli değildir, yalnızca hareketin ardından yeni mesafe Y olduğu sürece, yani gerçekten hiç hareket etmiyorsunuzdur, siz Sadece bir mesafeyi değiştiriyorum. (Dürüst olmak gerekirse bütün Einstein'ı aşmak istemedim ...)

Ancak, kamera olmadığı için, mesafesini değiştirebileceğiniz tek şey nesnelerdir. Böylece nesnelerin mesafesini değiştirirsiniz ve çıkan sonuç aynıdır. Tüm nesneler yine de dönüşümden geçtiğinden , bu daha fazla veya daha az pahalı değildir.

Daha basit bir matematiksel açıklama daha fazla yardımcı olabilir. Tüm koordinatların 1D olduğunu farz edelim - bakış açısı 0’da, nesneleriniz 4’te ve siz bakış açısının 3’e gitmesini istiyorsunuz. Bu, aralarındaki mesafenin 4 (4 - 0) - 1 (4 - arasında değişeceği anlamına gelir. 3). Ancak kamera mevcut olmadığından, bunu 0 değiştiremezsiniz; O her zaman 0 olacaktır. Bu yüzden 3'e 0 eklemek yerine (ki yapamazsın) 3'ten 4'e çıkarırsın (ki yapabilirsin) - nesneler şimdi 1'dedir ve sonuç aynıdır - arasındaki mesafe bakış açısı ve nesneler 1'dir.


Kamera böyle olmasa da, dönüşümden önceki konumunu hala hesaplayabilirsiniz. Bununla birlikte, bazı durumlarda (eksen hizalı olmayan paralel projeksiyon), dönüşüm matrisinden daha az kullanışlı olan "sonsuzda" (pozitif veya negatif) normal koordinatlardan birden fazlasına sahip olacaksınız.
Martin Sojka

7

Kamerayı hareket ettirmek veya dünyayı hareket ettirmek, her ikisi de aynı şeyi yapan iki eşit geçerli seçenek. Günün sonunda bir koordinat sisteminden diğerine geçiyorsunuz. Yukarıdaki cevaplar doğrudur, ancak hangi şekilde görselleştirdiğinizi aynı madalyonun iki yüzüdür. Dönüşümler iki yönlü de olabilir - bunlar sadece birbirlerinin tersidir.

Oluşturma işleminin bir kısmı dünya koordinatlarından göz koordinatlarına dönüşür. Ancak bunu modellemenin kolay bir yolu, uygulamanızdaki sanal kamera nesnesidir. Kamera, projeksiyon matrisini (perspektif etkisinden sorumlu olan) ve aynı zamanda dünyadan göz uzayına dönüştürmek için kullanılan görünüm matrisini temsil edebilir.

Köşe gölgelendirici, geometrinizin koordinatlarını göz uzayına dönüştürmek için görünüm matrisini kullanmasına rağmen, sanal dünyanızın etrafında hareket eden bir kamera nesnesini düşünmek genellikle daha kolaydır ve hareket halindeyken görünüm matrisini yeniden hesaplar.

Uygulamanızda, kamerayı dünya kodları içinde hareket ettirirsiniz, kameranın görünüm matrisini günceller, yeni görünüm matrisini bir eşik veya blok parçası olarak köşe gölgelendiricisine geçirir, sahneyi oluşturur.


5

Bunun yerine kusurlu bir benzetme olduğunu söylerdim. En temelde, "kamerayı hareket ettirmek" ve "dünyayı hareket ettirmek" aynı matematiksel yapıdır - sadece dünyayı hareket ettirmek, özellikle hiyerarşik dönüşümler söz konusu olduğunda, kavramsal olarak düşünmek biraz daha kolaydır. Temel olarak, dünyayı kameranın etrafında dolaştırıyorsunuz, ancak dünya köşelerini kameranın koordinat alanına çeviriyorsunuz - ama bu tersinir bir afin dönüşümü.

Bununla birlikte, görünürlük saptamasını karışıma dahil etmeye başladığınızda, yapmak istediğiniz SON şey, tüm dünyayı kamera etrafında çevirmektir. Bunun yerine, çoğu durumda (özellikle klasik sabit BSP'ler veya benzerleri), hangi şeylerin görünebileceğini belirlemek için kameranın dünyadaki konumunu kullanarak görünürlük yapılarınızı sorgulamak için kullanacaksınız ve daha sonra yalnızca THOSE terimini çevireceksiniz. Kameranın koordinat alanı içine şeyler.


4

İddiaların kategorik olarak doğru olduğunu sanmıyorum, çünkü biri oyunda dünya koordinatlarını nadiren “hareket ettiriyor”, ancak aslında sanal kameranın koordinatlarını değiştiriyor.

Kamera konseptinin gerçekte yaptığı şey, sonlu görüş frustumunu - yani 8 köşe noktalı (veya 6 düzlemin kesiştiği ile tanımlanan) kesilmiş bir piramit, openGL'nin son aşamalarında klip alanını temsil eden bir birim küpüne dönüştürmektir. boru hattının oluşturulması.

Bu anlamda dünya hareket etmiyor, ancak biri sadece klips uzayının koordinat sistemindeki dünya koordinatlarını hesaplıyor.


2

Fotoğraf makinesini hareket ettirmek veya dünyayı hareket ettirmek eşit derecede geçerli iki seçenek (ve ikisi de gerçek). Günün sonunda bir koordinat sisteminden diğerine değişiyoruz. Dönüşümler iki yönlü de olabilir - bunlar sadece birbirlerinin tersidir.


2

Burada bir sürü iyi cevap var. Hiçbirini tekrar etmemeye çalışacağım. Direct3D'nin yaptığı gibi, bazen kamera açısından düşünmek daha kolaydır (not: çok fazla 9.0c sonrası oynamamıştır)

Futurama anlamında olduğu gibi “dünyayı hareket ettirmek”, orada alıntı yapılan birinin ona bakmak için çok iyi bir yol olduğu anlamına geliyor (“Motorlar gemiyi hiç hareket ettirmiyor. Gemi olduğu yerde kalıyor ve motorlar evreni dolaştırıyor. o!"). Bu aslında 2D oyunlar için oldukça yaygındı. Kelimenin tam anlamıyla, ayarlamakta zorlanacağınız bir manzaraya sahiptiniz ve bu bazen video RAM'ınız ya da bir UI Penceresiydi. Eğer OpenGL bu nedenlerle yaparsa, söylemesi zor.

Kamera açısından da 2D hareketini kesinlikle düşünebilirsiniz ve sadece bu tür bir düşünme süreci, etkilerin anlaşılmasını kolaylaştırabilir.


1
Geç, ama güzel cevap da!
danijar

Teşekkürler! Her zaman bir arama motoru aracılığıyla bulunan sayfalardaki tartışmaya
katılmanın

2

OpenGL belgelerinin yazarlarından başlayarak burada bir sürü yanlış anlaşılma var gibi görünüyor ...

Akıl sağlığınızı çabucak düzeltmeme izin verin: dünya hareket etmiyor , kalıyor. Dünyayı oyuncunun etrafında dolaştırırken uygulamaya çalışan, çok oyunculu modda hızla başını belaya sokar. Her oyuncunun hamlesinde dünyadaki milyonlarca (veya milyarlarca) nesnenin pozisyonunu güncellemenin oldukça yavaş bir oyun yaratacağından bahsetmiyorum bile ...

Peki, orada gerçekte ne oldu ve teklifin nesi var?

Öncelikle bir koordinat sistemi kavramını anlamanız gerekir. Genel olarak, dünyadaki bir noktayı seçersiniz ve onu “orijin” olarak ilan edersiniz, yani koordinatlara sahip bir nokta (0,0,0). Ayrıca, X, Y ve Z olarak adlandırdığınız üç "ana" yön seçersiniz. Açıkçası, bir koordinat sistemi atamanın birçok yolu vardır. Genellikle bir "dünya koordinat sistemi" vardır, bu sistemde dünya durağandır (az ya da çok). Bir oyunda bu sistem seviye tasarımcısı tarafından seçilecektir.

Şimdi, oyuncunun gözüne bağlı başka bir koordinat sistemi düşünmek de uygun. Bu koordinat sisteminde, oyuncu her zaman koordinatlardadır (0,0,0) ve dünya onun etrafında hareket eder ve döner. Dolayısıyla, oyuncunun koordinat sisteminde yapıldığını anlarsanız, teklif doğrudur .

Ancak dünya oyuncunun koordinatlarında işlemez, dünya koordinatlarında işlem görür. İki koordinat sisteminin dahil olduğu yerlerde, her zaman bir tür koordinatı diğerine dönüştürmenin bir yolu vardır. OpenGL'de bu, 4x4 görünüm matrisi kullanılarak yapılır.

Sonuçta, bir oyuncu hareket ettiğinde, oyuncu hareket ederken dünya sabit kalır. Bu, dünya koordinatlarında, nesnelerin oyununuzda saklanma şeklidir. Müzikçalarda kendisiyle ilişkilendirilmiş bir görüş kamerası da var ve bu kamera dünya çapında benzer şekilde hareket ediyor (OpenGL belgelerinin söylediklerine rağmen). Bununla birlikte, dünyayı kullanıcının ekranında göstermek için, tüm görünür nesnelerin koordinatları bir dönüşüm matrisi kullanılarak oyuncunun koordinat sistemine çevrilir ve sonra bir perspektif efekti oluşturmak için ek projeksiyon uygulanır. Bu oyuncunun koordinat sisteminde, dünya aslında oyuncunun etrafında hareket ediyor gibi görünüyor. Ama bu sadece düşünmenin çok yararsız ve kafa karıştırıcı bir yolu.


" OpenGL dokümanlarının yazarlarından başlayarak " Doğru, çünkü OpenGL'in yapımcılarının bir dünya sunumu (tüm OpenGL'nin umurunda olduğu) ile o dünyanın kavramsal temsili arasındaki farkı anlayamayacak kadar aptal olduklarından eminim. ki bu OpenGL'in uğraştığı bir şey değil).
Nicol Bolas

Ama bu sadece düşünmenin son derece yararsız ve kafa karıştırıcı bir yolu. ” Bu da gerçek . Ve gerçek her zaman bir yalandan daha faydalıdır. Çünkü er ya da geç, o yalan sana yetişecek ve gerçeklerle yüzleşmelisin.
Nicol Bolas
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.