Normal vektörünüzün şu an içinde bulunduğunuz düzlemde varsa, ya da kolayca hesaplayabiliyorsanız, bunu yapmanın en kolay yolunun iki düzlemde ortak eksen etrafında dönmesi olacağını düşünüyorum. İşte bu konuda gitmek istiyorum nasıl:
- Let geçerli düzleme normal bir vektör olmak
M
ve N
içine döndürmek istediğiniz düzleme normal vektör olsun. M == N
ise şimdi durabilir ve orijinal noktaları değiştirmeden bırakabilirsiniz.
unitcross
yani
unitcross(a, b) = cross(a, b)/norm(cross(a, b))
, çapraz ürün gerçekleştirir ve bir birim vektörüne normalleştiren bir fonksiyondur
axis = unitcross(M, N)
olarak dönme ekseni hesaplayın
costheta = dot(M,N)/(norm(M)*norm(N))
olarak döndürme açısını hesaplar. Bir yorumda user1318499 belirtildiği gibi, unitcross
uygulamanız, a == b
olduğunda (0,0,0)
döndürmedikçe, bu adım M == N
ise bir hataya neden olabilir.
hesaplayın x
, y
ve z
axis
bileşenleridir
c = costheta
s = sqrt(1-c*c)
C = 1-c
rmat = matrix([ x*x*C+c x*y*C-z*s x*z*C+y*s ],
[ y*x*C+z*s y*y*C+c y*z*C-x*s ]
[ z*x*C-y*s z*y*C+x*s z*z*C+c ])
olarak eksenine açısı rotasyon matrisidir. Bu formül, on Wikipedia tarif edilmektedir.
- her bir nokta için, fonksiyon
dot
matris çarpımını yapar newpoint = dot(rmat, point)
yeni düzlem üzerindeki karşılık gelen bir noktası hesaplamak.
Bu elbette eşsiz değildir; Peterk'in cevabında belirtildiği gibi, uçağın normalini M
normale normal düzlemde N
'a dönüştürebilecek sonsuz sayıda olası rotasyon vardır. Bu, yukarıda açıklanan adımları uyguladıktan sonra, uçağı N
etrafında döndürebilir ve aynı düzlemde kalırken puanlarınızın farklı yerlerde olabileceği gerçeğine karşılık gelir. (Diğer bir deyişle, koşullarınızı karşılayan her dönüş, yukarıda açıklanan prosedürü yerine getirmeye karşılık gelir ve bunu takiben N
etrafında başka bir rotasyon izler.) Ancak, uçağınızın nereye gittiğini umursamıyorsanız, bu rotasyon etrafında düşünüyorum göreceli Eğer M
yoksa ortak eksen
. sadece bunları istediğiniz uçağa puan almak için en basit yoldur, ancak başlangıç düzlemde noktaların koordinatlarını var numaralı düzlemdeki bir başlangıç noktasına, iki noktadaki konumlardan x1
ve x2
012 olarak başlangıç normal vektörünü hesaplayabilirsiniz
M = cross(x1, x2)
(unitcross
'u da kullanabilirsiniz, ancak herhangi bir fark yaratmaz). Eğer points varsa düzleminde olmayan bir başlama noktasına göre koordinatları, hala bunu yapabilir, ama üç puan gerekir pozisyonları:
M = cross(x3-x1, x3-x2)
+1 İyi cevap. Tek sıkıntı (sorgulanabilir bir kavrayış seviyesine kadar yükseldiği ölçüde) Ben Quaternion Rotation'dan 4. ve 5. adımlara olası bir alternatif olarak bahsetmediniz. Biraz daha verimli. – andand
@andand: genellikle bu tür bir şeyi analitik olarak yapıyorum, bu yüzden kuaterniyonlara tamamen aşina değilim. Ama eğer zamanım varsa onu düzenlerim. –
http://en.wikipedia.org/wiki/Quaternion_rotation – andand