Selasa, 30 November 2010

Sistem Untuk 3D Engine

Sistem Untuk 3D Engine

Pengantar

OK, jadi mungkin Anda memiliki menjalankan mesin yang memiliki bebek, berputar di tengah layar. Sangat bagus, tetapi tidak banyak digunakan untuk melakukan 'nyata' sesuatu dengan. Anda membutuhkan sebuah kamera. Anda harus bisa berjalan di sekitar, untuk melihat bebek di sudut yang berbeda, untuk memperbesar masuk Anda membutuhkan sebuah sistem tampilan yang tepat.

Rotasi XYZ Sistem Angle

Jadi Anda berpikir, aku tahu, aku akan membuat sistem di mana kamera saya memiliki 3 sudut, X, Y dan Z rotasi. Lalu aku tambahkan saja di posisinya. Jadi, Anda membangun sebuah matriks, menerapkan transformasi bahwa untuk model, kemudian memasukkannya ke dalam ruang kamera. Tampaknya untuk bekerja dengan baik ...tapi agak terbatas. Menentukan orientasi dalam hal sudut XY dan Z adalah rumit, dan bisa menimbulkan masalah. Misalnya, setelah Anda mulai berputar di sekitar sedikit, rotasi di sumbu X tidak mungkin menghasilkan hasil yang Anda harapkan. Anda juga mungkin mengalami "Gimbal Lock", di mana rotasi dapat membatalkan satu sama lain, dan seterusnya.

Namun, semua tidak hilang. Ini adalah sistem yang sangat sederhana untuk menerapkan, dan Anda dapat membuat sebuah sistem yang sederhana, efektif menggunakannya. Sebagai contoh, Anda dapat dengan mudah membangun sebuah sistem yang memiliki tampilan parameter Yaw, Roll dan Tilt. Yang harus Anda lakukan adalah membuat sebuah rotasi Y matriks, tentang sudut Yaw, rotasi Z matriks tentang sudut Roll, dan rotasi X matriks tentang sudut Tilt. Kalikan mereka dalam urutan YXZ, dan Anda sekarang memiliki cara mudah untuk bergerak dalam ruang 3D, mengubah sudut dalam cara yang mudah. Sederhana, tetapi bekerja.

Sistem ini UVN Vektor

Ini cukup sistem yang baik. Dari 3D Computer Graphics, oleh Alan Watt. Ia bekerja dengan mendefinisikan 3 vektor, U, V dan N. vektor ini adalah kanan, atas, dan melihat arah, masing-masing. Jika Anda mengambil tangan kiri Anda, arahkan jari telunjuk Anda ke depan, ibu jari Anda tongkat ke langit, dan titik jari tengah ke kanan, kemudian jari tengah Anda adalah U, ibu jari Anda adalah V, dan jari telunjuk Anda N. Bayangkanbahwa vektor berorientasi sistem melihat. Sehingga untuk memutar 'kepala' Anda ke kiri, Anda akan memutar tentang vektor V, untuk menggulung, Anda akan memutar tentang N, dan seterusnya. Juga diperlukan untuk menggunakan sistem ini adalah asal, titik kamera. Untuk menggunakan sistem ini, Anda akan perlu membangun melihat matriks. Ini dihitung dengan mengalikan bersama dua matriks. Sistem ini diberikan oleh:

Terjemahan matriks =

| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
|-X-y-z 0 |

matriks Rotasi =

| Ux Vx Nx 0 |
| Uy Vy Ny 0 |
| Uz Vz Nz 0 |
| 0 0 0 1 |

CameraMatrix = Terjemahan * Rotasi

N juga dapat dihitung sebagai:

sudut azimut =
e = sudut elevasi
Nx = sin cos * (e) (a)
Ny = sin (e) dosa * (a)
Nz = cos (e)

Untuk titik pada posisi yang sewenang-wenang, Anda akan perlu untuk mendefinisikan N sebagai vektor satuan antara kamera dan titik. U dan V akan ditebak, dan disesuaikan. Untuk menyesuaikan vektor, cukup lakukan:

V = V '- (V' N *) N *

Dimana V adalah menebak Anda di V. U adalah produk salib N dan V.

Memahami Bagaimana Model Kamera Pekerjaan

Aku sudah beberapa orang berbicara kepada saya di IRC, dengan pemahaman kesulitan bagaimana sistem ini bekerja. Yah, aku akan memberikan penjelasan penuh, dengan melanggar semua ke dalam potongan-potongan kecil, dan re-assembling menjadi cara Anda dapat mengerti.

Bagian # 1: Vektor UVN
Bagian ini saja telah menyebabkan cukup banyak kebingungan. Singkatnya, UV dan N adalah 3 vektor yang digunakan untuk mengorientasikan nilai XY dan Z poin Anda. U adalah untuk sumbu X, V adalah untuk sumbu Y, N adalah untuk sumbu Z.

Sekarang, kita semua bisa berkeliling, riang mengatakan bahwa titik adalah di (1, 2, 3).Tapi apa yang kita benar-benar berarti ketika kita mengatakan ini? Sederhana. Intinya adalah 1 unit dari asal di AXIS X, intinya adalah 2 unit dari asal di AXIS Y, dan intinya adalah 3 unit dari asal di AXIS Z. Mengapa saya menekankan sumbu panjang? Karena itu adalah kunci untuk memahami rotasi.

Ketika saya mengatakan "sumbu X", apa artinya? Yah, sumbu dapat dianggap sebagai vektor unit - arah. Sebuah sumbu tak terbatas biasanya tak terbatas di setiap arah.Sumbu X memiliki nilai (1, 0, 0). Sekarang, bayangkan bahwa untuk mendapatkan poin X koordinasi di ruang kamera, kita harus peta titik ke sumbu X. Kami akan berakhir dengan sesuatu seperti:

NewPoint.X = XAxis.x XAxis.y * Point.x * XAxis.z Point.y * Point.z

Yang menyederhanakan ke:

NewPoint.X = 1 Point.x * 0 * Point.y 0 * Point.z

Dapatkah Anda melihat apa yang telah terjadi? Kami tidak hanya mengambil nilai X, kita mengambil jarak dari asal sepanjang sumbu X. Sekarang, sebagai sumbu X dapat berorientasi secara sewenang-wenang, maka sebagai sumbu berputar, titik mengambil nilai baru: XY dan Z sedang digabungkan dalam rasio yang berbeda.

Ingatlah bahwa kita memiliki vektor yang sama dari V dan N - Y dan sumbu Z. Sekali lagi, pendekatan serupa diambil kepada mereka: tidak hanya mengambil Y atau Z koordinasi, tetapi mengambil jarak dari asal sepanjang sumbu. Sangat penting bahwa Anda memahami bagian itu.

Sekarang, UV dan N selalu tegak lurus satu sama lain, yaitu mereka akan membentuk sudut kubus, terlepas dari rotasi, sudut antara satu sama lain akan tetap sama, hanya perubahan orientasi. Untuk memvisualisasikan ini, ambil tangan kiri Anda. Tunjukkan jari telunjuk Anda, tongkat ke atas ibu jari Anda ke langit, dan tongkat jari tengah Anda ke kanan. jari telunjuk Anda adalah N, Anda thumb V, dan jari tengah Anda U. Putar tangan Anda sedikit. Seperti yang anda lihat, vektor berputar di sekitar, mengubah rotasi kamera, tapi masih tetap pada sudut yang sama satu sama lain.

Kamera Posisi
posisi kamera juga telah memberikan sedikit kesulitan. Apa yang harus Anda ingat adalah bahwa posisi kamera ditentukan di dunia-koordinat, dan ketika kita melakukan penerjemahan, kami peta dunia kembali ke kamera, tidak peta kamera ke dalam dunia.Jadi, ketika kita menerjemahkan, dunia akan bergerak menuju kamera. Untuk melakukan itu, kita perlu menerjemahkan oleh vektor negatif. Dan vektor itu adalah posisi kamera. Kembali ke metafora saya "tangan", bayangkan bahwa posisi tangan Anda adalah posisi kamera.

Ruang, (0, 0, 0), Dan Hal-hal seperti Lainnya
Pertimbangkan apa yang terjadi ketika kita menerapkan-camera.pos untuk setiap-co ordinat dalam ruang. Mereka semua bisa diterjemahkan dengan jumlah yang sama, termasuk kamera, yang akan ditempatkan di (0, 0, 0) - asal. Jadi, Anda bisa memikirkan posisi kamera sebagai asal usul dunia. Namun dunia ruang co-ordinates tidak didefinisikan relatif terhadap titik itu, mereka didefinisikan relatif terhadap (0, 0, 0) (BUKAN CAMERA POINT PIKIRAN!). Jadi, terjemahan dengan bergerak-camera.pos koordinat harus relatif terhadap kamera, bahkan, Anda bisa membuat setiap titik pusat dunia menggunakan sistem tersebut.

Juga, mempertimbangkan apa yang dilakukan rotasi. Cobalah untuk berpikir tidak begitu banyak kamera itu sendiri berputar, melainkan dunia di sekitarnya berputar, yang mundur dipetakan ke alam semesta, yakni, kami tidak mengambil kuda ke pasar, kita membawa pasar untuk kuda.

Tidak ada komentar:

Posting Komentar