2012-02-24 15 views
7

Köşesi sys A'da, üzerinde zaten bir dizi nokta bulunan bir düzlemin olduğu bir şey yapıyorum. Ayrıca uzay N'de normal bir vektörüm var. Köşe sys A'daki noktaları nasıl döndürebilirim ki altta yatan düzlemin N?Bir düzlemin 3 boyutlu dönüşleri

Herhangi birinin bunun nasıl yapılacağı konusunda iyi bir fikri olup olmadığını merak etme. Teşekkürler

cevap

16

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:

  1. 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.
  2. 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)) 
    
  3. 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.

  4. hesaplayın x, y ve zaxis 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.

  5. 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

+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

+0

@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. –

+1

http://en.wikipedia.org/wiki/Quaternion_rotation – andand

0

Bir birim vektörü oluşturmayı düşünüyorum [0,0,1] ve fark açısını bulmak için nokta-ürünü iki düzlem boyunca kullanın ve tüm puanlarınızı bu açılardan kaydırın. Bu, z-ekseninin normal vektörle hizalanmasını istediğinizi varsayar, sadece x ve y için sadece [1,0,0] veya [0,1,0] kullanın.

+0

bu z-eksenini sadece hizaya olmaz ? Daha fazla Dof, x veya y – bendervader

1

Tek bir vektör (normalin - N) yeterli olmaz. Diğer iki boyut için başka iki vektöre ihtiyacınız olacak. (3 boyutlu alanınızın normal vektörün etrafında dönebileceğini/döndürebildiğini ve bunu düzeltmek için başka 2 vektöre ihtiyacınız olduğunu düşünün). Düzlemde normal ve bir tane daha varsa, üçüncü olanı bulmak kolay olacaktır (sisteminize bağlı olarak sol veya sağ elle).

Üçünün de normalleştirildiğinden (1 uzunluğundan) emin olun ve bunları bir matrise yerleştirin; 3D alanınızdaki herhangi bir noktayı dönüştürmek için matrisi kullanın (matris çarpımını kullanın). Bu size yeni koordinatları vermeli.

+0

olacaktır. Diğer vektörü elde etmenin bir yolunu bulmam gerekecek: S Teşekkürler! – bendervader

+2

-1: Bu cevap belirsiz ve eksik. – andand

İlgili konular