Apa cara termudah untuk Menerapkan Kamera Orang Ketiga di C ++ / DirectX9

8

Saya cukup baru untuk C ++ dan DirectX9 dan saya ingin Menerapkan Kamera Orang Ketiga. Setelah beberapa membaca tentang Kamera berbasis Quaternion saya memutuskan untuk mencoba Menerapkannya. Tapi itu benar-benar membuat saya berpikir, jadi saya bertanya di sini apa cara termudah untuk Menerapkan Kamera-TP?

Berikut adalah hal-hal yang harus dilakukan Kamera:

  • Ikuti koordinat yang disimpan dalam 3DVector (x, y, z)

  • Putar di sekitar Objek (Halus)

  • Mungkin beberapa jenis 'pegas' = Perlahan-lahan bergerak kembali ke Pos normal di belakang Objek setelah Memutar

Minta maaf untuk bahasa Inggris saya yang buruk: Saya orang Jerman dan masih di sekolah!

Terima kasih sebelumnya!

EDIT:

Setelah mencoba, saya mengerti.

Masalah terbesar yang saya pertimbangkan adalah penggalian kanan vektor "arah" dari Matriks-Dunia.

Selama penelitian saya, saya menemukan sebagian besar hal seperti ini:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
direction.y = worldMatrix->_23;
direction.z = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Itu TIDAK bekerja untuk saya! Sebaliknya saya melakukan ini:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
// Consider the .y after the .z!
direction.z = worldMatrix->_23;
direction.y = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Untuk penskalaan:

// The tenfold of the average distance
D3DXVec3Scale(&direction, &direction, 10.0f);

Mengatur Posisi:

cameraPos = targetPos - direction;
// For a top-view
cameraPos.y = targetPos.y + 5;

Untuk Rotasi, Anda harus membuat Matriks dunia sementara (dari posisi target) dan memutarnya sesuai keinginan dan mengekstrak arahnya.

Smoothing of the Rotation sangat tergantung pada game ANDA!

Kamera 3rd Person jenis ini sangat mudah dibuat dan berfungsi dengan baik!

SANGAT BESAR terima kasih kepada "jheriko" yang memberi saya jawaban yang benar!

Anonim Anonim
sumber
+1 untuk benar-benar menggambarkan apa yang Anda butuhkan, itu jarang terjadi (walaupun itu bisa lebih rinci, misalnya poin ke-3 membingungkan - bukankah Anda menyiratkannya berputar bebas?).
keajaiban
Ya, itu harus berputar dengan bebas tetapi saya ingin kembali perlahan ke Point di belakang pemain setelah Rotasi selesai!
Anonim Anonim

Jawaban:

1

Apa yang akan membantu Anda adalah memiliki matriks transformasi untuk objek yang ingin Anda ikuti. Anda dapat mengekstrak vektor foward dari matriks ini - tergantung pada sistem koordinat Anda dan penguasaan matriks ini akan menjadi salah satu baris atau kolom dengan komponen ke-4 dihapus (dengan asumsi Anda menggunakan matriks transformasi 4x4, tanpa faktor skala - faktor skala mengerikan untuk banyak alasan ... tetapi jika Anda memiliki faktor skala Anda dapat menormalkan baris / kolom setelah menghapus komponen ke-4.)

Setelah Anda memiliki ini, Anda dapat memposisikan kamera langsung di belakang objek dengan mengurangi ini dari posisi objek. Untuk memindahkan kamera ke dalam dan ke luar, Anda dapat skala vektor, dan untuk memutar di sekitar objek Anda dapat membuat rotasi x dan y (atau xz / zy dll, tergantung pada wenangan dll) yang Anda terapkan ke salinan matriks objek sebelum mengekstraksi arah maju.

Akhirnya untuk memuluskan pergerakan, solusi paling sederhana adalah melacak offset dan sudut sebelumnya dan lerp ke arah mereka dengan sejumlah framerate dependen yang dijelaskan oleh a (b.dt) di mana dt adalah waktu delta dan a, b adalah parameter yang Anda pilih. a = 0,9 dan b = 30 memberi Anda efek bergerak 90% ke arah posisi seolah-olah Anda melakukannya setiap frame pada 30 fps. ini disebut filter 'respon impuls tak terbatas' dan merupakan retasan klasik untuk jenis perataan ini.

ini mungkin tidak ideal, Anda mungkin ingin memilih jarak minimum dan membatasi sudut juga, jika tidak kamera dapat melewati objek. jika Anda berada di dalam dunia padat yang guntingan atau memudar objek intervensi akan menjadi penting juga.

maaf ini lama, tapi itu bukan masalah sepele, seperti yang tampaknya telah Anda temukan.

semoga ini membantu. saya dapat memberikan detail yang lebih dalam jika perlu.

(ps tidak ada angka empat yang diperlukan - mereka benar-benar tidak membantu untuk masalah ini)

jheriko
sumber
Terima kasih banyak! Anda memberi saya beberapa ide bagaimana melakukan ini. Tetapi saya akan menghargai beberapa contoh Kode, jika Anda tidak keberatan. Dan mengapa tidak menggunakan angka empat? Saya membaca bahwa mereka biasanya digunakan untuk melakukan hal-hal semacam ini ( en.wikipedia.org/wiki/Quaternion ).
Anonim Anonim
Mencoba melakukannya seperti yang Anda gambarkan, tetapi masih memiliki beberapa Masalah. Kamera tidak berada di belakang Player dengan benar, tetapi setidaknya di suatu tempat di sisinya! Saya tidak mengerti bagian dengan rotasi X dan Y: Apa yang harus diputar? Matriks dunia, vektor arah atau salinan vektor posisi pemain? Dan bagaimana cara memutar? Semoga Anda bisa membantu saya!
Anonymous Anonymous
Anda memutar vektor arah, atau matriks yang Anda ekstrak dari (matriks transformasi objek, bukan dunia atau matriks tampilan) untuk memutar Anda membuat matriks rotasi sudut sumbu dan mengalikannya, atau menggunakan trigonometri ...
jheriko