Saya memiliki beberapa model yang ingin saya putar menggunakan angka empat dengan cara normal, kecuali alih-alih rotasi tentang asal, saya ingin sedikit diimbangi. Saya tahu bahwa Anda tidak mengatakan, dalam ruang 3d, bahwa Anda memutar titik; Anda mengatakan Anda memutar tentang sumbu. Jadi saya memvisualisasikannya sebagai memutar tentang vektor yang ekornya diposisikan tidak pada asal lokal.
Semua transformasi affine di mesin rendering / fisika saya disimpan menggunakan SQT (skala, angka empat, terjemahan; sebuah ide yang dipinjam dari buku Game Engine Architecture .) Jadi saya membangun sebuah matriks setiap frame dari komponen-komponen ini dan meneruskannya ke vertex shader. Dalam sistem ini, terjemahan diterapkan, lalu skala, lalu rotasi.
Dalam satu kasus khusus, saya perlu menerjemahkan objek di ruang dunia, skala, dan memutarnya tentang titik yang tidak terpusat pada asal lokal objek.
Pertanyaan: Mengingat kendala sistem saya saat ini yang dijelaskan di atas, bagaimana saya bisa mencapai rotasi lokal yang berpusat pada titik selain titik asal? Otomatis upvote kepada siapa saja yang dapat menggambarkan bagaimana melakukan ini hanya dengan menggunakan matriks :)
sumber
Jawaban:
Pendeknya
Anda hanya perlu mengubah T di formulir SQT Anda.
Ganti vektor terjemahan
v
dengan div' = v-invscale(p-invrotate(p))
manav
vektor terjemahan awal,p
adalah titik di mana Anda ingin rotasi terjadi, daninvrotate
daninvscale
merupakan kebalikan dari rotasi dan skala Anda.Demonstrasi cepat
Membiarkan
p
menjadi titik di mana Anda menerapkan rotasir
. Biarkans
menjadi parameter penskalaanv
Anda dan vektor terjemahan Anda. Transformasi matriks akhirT(p)R(r)T(-p)S(s)T(v)
bukanR(r)S(s)T(v)
.Apa yang Anda inginkan adalah parameter transformasi baru
v'
,r'
dans'
transformasi matriks akhir adalahR(r')S(s')T(v')
dan kami memiliki:Perilaku tak terhingga menunjukkan bahwa parameter rotasi dan parameter penskalaan tidak dapat berubah (ini dapat diperagakan). Dengan demikian kita memiliki
r = r'
dans = s'
. Karenanyav'
, satu-satunya parameter yang hilang adalah vektor terjemahan baru Anda:Jika matriks ini sama, kebalikannya sama:
Ini terutama berlaku untuk asal
O
:Menskalakan dan memutar asal menghasilkan asal, dengan demikian mendapatkan:
v'
adalah vektor terjemahan baru yang Anda cari yang memungkinkan Anda menyimpan transformasi Anda dalam bentuk SQT. Mungkin saja menyederhanakan perhitungan; tetapi setidaknya penyimpanan yang dibutuhkan tidak bertambah.sumber
Semua formula rotasi kanonik yang digunakan untuk menurunkan matriks rotasi Anda adalah untuk rotasi tentang asal. Jika Anda ingin menerapkan rotasi di sekitar titik tertentu, Anda harus terlebih dahulu mengimbangi titik asal - atau, ekuivalennya, memindahkan objek sehingga titik yang ingin Anda putar ada di titik asal.
Pertimbangkan kasus 2D terlebih dahulu, karena lebih sederhana dan skala teknik. Jika Anda memiliki kubus lebar 2 yang berpusat pada titik asal dan Anda ingin memutarnya 45 derajat di tengahnya, itu akan menjadi aplikasi sepele dari matriks rotasi 2D .
Tetapi jika sebaliknya Anda ingin memutarnya di sudut kanan atas (terletak di
1,1
) Anda harus terlebih dahulu menerjemahkannya sehingga sudut tersebut berada di tempat asalnya. Ini dapat diselesaikan dengan terjemahan-1,-1
. Kemudian Anda dapat memutar objek seperti sebelumnya, tetapi Anda harus mengikuti ini dengan menerjemahkannya kembali (oleh1,1
). Jadi secara umum, untuk mencapai matriks rotasiR
untuk rotasir
sekitar titik yangP
Anda lakukan:di mana
translate
danrotate
masing-masing merupakan matriks terjemahan / rotasi kanonik. Seperti yang terjadi, skala ini sepele ke 3D, yang pengecualian harus memasok sumbu untuk rotasi juga - Anda selalu bisa memilih matriks rotasi sumbu X, Y atau Z kanonik, tetapi itu akan membosankan. Anda akan ingin menggunakan matriks rotasi sudut sumbu sewenang - wenang . Jadi final AndaR
dalam 3D adalah:di mana
a
vektor satuan mewakili sumbu rotasi danP
sekarang menjadi titik 3D dalam ruang model yang mewakili titik rotasi.Ketika itu terjadi, angka empat dapat dikonversi ke dan dari representasi matriks, sehingga Anda dapat melakukan penggabungan Anda dengan cara yang harus Anda pilih. Atau Anda bisa meninggalkan semuanya sebagai matriks (angka empat memiliki beberapa keuntungan bagus seperti menjadi lebih mudah untuk diinterpolasi dengan cara yang waras, tetapi apakah Anda membutuhkannya atau tidak, itu tergantung pada Anda).
Juga:
Sebenarnya, sementara vektor dapat digunakan untuk mewakili posisi dengan menganggapnya sebagai perpindahan dari suatu asal, vektor tidak memiliki posisi sendiri sehingga agak tidak biasa untuk memvisualisasikannya.
sumber