Bagaimana cara saya mengkonversi dari ruang koordinat global ke ruang lokal?


13

Diberikan entitas bernama EntityA, saya ingin mendefinisikan ruang koordinat lokal, di mana posisi EntityAadalah asal, vektor headingnya adalah sumbu X, dan normal vektor heading adalah sumbu Y:

deskripsi bergambar sama

Dengan koordinat globalnya, bagaimana cara menemukan posisi entitas lain di EntityAruang lokal?

Contoh: EntityAPosisi global adalah (50,50), dan itu EntityBadalah (80,90). Apa maka posisi EntityBdi EntityAruang lokal 's?

EDIT: Silakan lanjutkan matematika.

Jawaban:


21

Oke, jadi anggaplah Anda tahu apa matriks World Transformation untuk objek A itu, Anda hanya perlu membuat kebalikan dari matriks itu dan Anda akan mendapatkan apa yang Anda butuhkan.

Misalkan rotasi, penskalaan dan matriks terjemahan dari objek A yang digunakan untuk mendapatkannya ke Global Space adalah R , S dan T masing-masing. Anda akan mengalikannya menjadi seperti ini

S * R * T = W

Sekarang, ambil W dan temukan kebalikannya W ^ -1 . Kebalikan dari matriks adalah matriks yang melakukan sebaliknya. Produk dari matriks dengan kebalikannya selalu matriks identitas.

W * W ^ -1 = I

dengan demikian W ^ -1 = I / W ;

Sekarang Terapkan matriks terbalik ini sebagai transformasi dunia ke adegan dan setiap objek akan berada dalam koordinat yang Anda inginkan.

Untuk perkalian matriks, lihat halaman ini. Untuk matriks Identity, lihat ini.

Berikut halaman lain yang memberikan Anda matriks Anda akan perlu untuk membuat W .

Dalam pertanyaan di atas, Anda harus mengambil terjemahan dalam sumbu x 50, terjemahan dalam sumbu y sebagai 50, tidak ada penskalaan di kedua sumbu, dan rotasi yang belum Anda tentukan.


Terima kasih atas jawabannya tetapi saya sebenarnya tidak mengerti banyak tentang ini. Tidak pandai matematika. Dengan apakah sebuah matriks? Apa yang Anda maksud dengan 'rotasi, penskalaan, dan matriks terjemahan'?
Aviv Cohn

Sebuah Matrix adalah cara yang sangat kompak mewakili satu set nomor saling terkait atau benda. Dalam grafik Komputer, mereka digunakan secara luas untuk membuat perhitungan. periksa tautan terakhir dalam jawaban untuk mengetahui apa yang saya maksud dengan Rotation translation dan Scaling matrices.yes, Anda harus membaca semua itu. Kalau tidak, Anda dapat menggunakan metode ashes999 untuk menyelesaikan masalah Anda, tetapi itu tidak akan memperhitungkan rotasi dan penskalaan dari EntityA, jika ada.
The Light Spark

9

Saya sudah melakukan ini dengan trigonometri daripada matriks di masa lalu (saya seorang noob matriks). Jawaban Ashes999 ada di tengah-tengah, dapatkan vektor relatif, lalu putar dengan kebalikan dari sudut EntityA.

   relativeX = B.x - A.x
   relativeY = B.y - A.y
   rotatedX = Cos(-Angle) * relativeX - Sin(-Angle) * relativeY
   rotatedY = Cos(-Angle) * relativeY + Sin(-Angle) * relativeX

2
+1 Jauh lebih intuitif dan lebih mudah digunakan trigonometri daripada matriks.
Ramchandra Apte

Bagaimana dengan skalanya? Kapan Anda menerapkannya?
Llamageddon

Maaf, berarti rotasi.
Llamageddon

6

Biarkan saya mencoba memberi Anda sesuatu di antara jawaban The Light Spark dan jawaban Elliot, karena dari apa yang saya baca, Anda benar-benar mencari algoritma untuk diikuti dan bukan hanya matematika yang dilemparkan kepada Anda.

Pernyataan Masalah: Karena Anda memiliki lokasi A (50, 50)dan tajuk (karena Anda tidak menyediakannya, saya akan menyatakannya sebagai y = 2 * x + 25), cari di mana B (80, 90)relatif terhadap Adan tajuk tersebut.

Apa yang ingin Anda lakukan sebenarnya cukup mudah. 1) Pindahkan Ake tempat asal sistem Anda. Ini hanya berarti bahwa nilai- Anilai lokal akan menjadi nilai posisi global dikurangi nilai posisi global A. Amenjadi (0, 0)dan Bmenjadi (30, 40).

1.1) Judul juga perlu dipindahkan. Ini sebenarnya sangat mudah dilakukan, karena intersepsi y dalam Aistilah lokal selalu 0, dan kemiringannya tidak akan berubah, jadi kami memiliki y = 2 * xjudulnya.

2) Sekarang kita perlu menyelaraskan heading sebelumnya ke sumbu X. Jadi, bagaimana kita melakukan ini? Cara termudah, secara konseptual untuk melakukan ini adalah mengkonversi dari koordinat x, y ke sistem koordinat polar. Sistem koordinat kutub melibatkan R, jarak ke lokasi, dan phi, sudut rotasi dari sumbu x. Rdidefinisikan sebagai sqrt(x^2 + y^2)dan phididefinisikan sebagai atan(y / x). Sebagian besar bahasa komputer akhir-akhir ini maju dan mendefinisikan atan2(y, x)fungsi yang melakukan hal yang sama persis seperti atan(y/x)tetapi melakukannya sedemikian rupa sehingga output cenderung dari -180 derajat ke 180 derajat daripada 0 derajat ke 360 ​​derajat, tetapi keduanya berfungsi.

Bdengan demikian menjadi R = sqrt(30^2 + 40^2) = sqrt(2500) = 50, dan phi = atan2(40, 30) = 53.13dalam derajat.

Demikian pula, tajuk sekarang berubah. Ini agak sulit untuk dijelaskan, tetapi karena judulnya, menurut definisi, selalu melewati asal Akita, kita tidak perlu khawatir tentang Rkomponennya. Judul selalu akan dalam bentuk di phi = Cmana Ckonstan. Dalam hal ini, phi = atan(2 * x / x) = atan(2) = 63.435derajat.

Sekarang, kita dapat memutar sistem untuk memindahkan heading ke sumbu-X dari sistem-lokal A. Sama seperti ketika kita pindah Ake asal sistem, yang harus kita lakukan adalah mengurangi phijudul dari semua phinilai dalam sistem. Jadi phidari Bmenjadi 53.13 - 63.435 = -10.305derajat.

Akhirnya, kita harus mengubah kembali dari koordinat polar menjadi koordinat x, y. Formula untuk melakukan transformasi itu adalah X = R * cos(phi)dan Y = R * sin(phi). Karena Bitu, kami mendapatkan X = 50 * cos(-10.305) = 49.2dan Y = 50 * sin(-10.305) = 8.9, jadi Bdalam Akoordinasi lokal dekat (49,9).

Semoga itu membantu, dan cukup ringan pada matematika untuk Anda ikuti.


1

Anda perlu mengetahui pose Entity A di ruang global (x1, y1, θ), di mana θ adalah orientasi relatif terhadap sumbu x.

Untuk mengonversi lokasi EntityB dari koordinat global (x2, y2) ke koordinat lokal (x2 ', y2'):


  1. Menggunakan ekspresi

Global ke Lokal

x2' = (x2-x1)cosθ + (y2-y1)sinθ

y2' = -(x2-x1)sinθ + (y2-y1)cosθ

Lokal ke Global

x2 = x2'cosθ - y2'sinθ + x1

y2 = x2'sinθ + y2'cosθ + y1

  1. Menggunakan matriks:

    R = [cosθ   -sinθ
    
         sinθ    cosθ]
    
    A = [x1
         y1]
    
    B_global = [x2
                y2]
    
    B_local = [x2' 
               y2']

Global ke Lokal

    B_local = inv(R) x (B_global - A)

Lokal ke Global

    B_global = R x B_local + A

-2

Sederhananya entitas B akan memerlukan referensi ke entitas A. Anda kemudian harus mendapatkan perbedaan antara posisi entitas A dan posisi entitas B.


3
Saya tidak mengerti bagaimana ini menjawab pertanyaan.
Anko
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.