2016-04-07 10 views
1

explain problemjest CW veya ACW döndürme, 3 sipariş edip etmemeye karar örnek noktası

kullanım Unity3D içinde (ekranda örnek noktaları) C da (yoluyla) B, A ile başlayan ve hareket eder. bu noktada, her iki görüntüde de neredeyse 45 derece (neredeyse) olan açı (teta) hesapladım. problemin soldaki görüntüde kullanıcının CounterClockWise hareketinin ve sağ görüntü kullanıcısının saat yönünde dönmeyi amaçladığı sonucuna varmak istedim. ahh, hayal ettiğimden gerçekten karmaşık, lütfen öner.

anda birlik kodu

protected void calcAngles(){ 
    v1 = go2.position - go1.position; 
    v2 = go3.position - go1.position; 
    v3 = go3.position - go2.position; 
    float angle = Vector3.Angle (v2, v1); 
    Debug.Log ("angle:" + angle.ToString()); 
    //float atan = Mathf.Atan2 (Vector3.Dot (v3, Vector3.Cross (v1, v2)), Vector3.Dot (v1, v2)) * Mathf.Rad2Deg; 
    //Debug.Log ("atan2:" + atan.ToString()); 
} 

herhangi bir fikir gibi.? psudo kodu. şimdiden büyük teşekkürler. şerefe, lau

+0

Eğer bir kalabalık simülatörü inşa etmeyecekseniz (bu biraz ağır olacak), A'nın çocuğu olarak 2 yardımcı dönüştürücü kullanabilirsiniz. yerel alanda 0,0,0 konumundalar. Biri ** LookAt (B) ** kullanıyor. Bir diğeri de ** LookAt (C) ** kullanıyor. Öyleyse onların Y euler açıları arasındaki farkı alabilirsiniz. Bu, saat yönünde veya saat yönünün tersine dönmeniz gerekip gerekmediğini size söyleyecektir. –

+0

"kalabalık simülatörü" neye yöneliyorsunuz, Nika? Kırmızıdan yeşile doğru yön almak için – Fattie

+0

önemsizdir. sadece kırmızı eksi yeşildir. LookAt uygun değildir. Bu aslında * dönüşümü için kullanılır. sadece yönünü almak için, sadece pozisyonları çıkarma ve belki de – Fattie

cevap

2

Bunu yapmak derece zor olduğunu.

Bu yardımcı olabilir ... Bu 2D kavram, istediğiniz kadar değiştirin olduğunu

private float bestKnownXYCWAngleFromTo(Vector3 a, Vector3 b) 
// the best technology we have so far 
    { 
    a.z = 0f; 
    b.z = 0f; 

    float __angleCCW = Mathf.Atan2(b.y, b.x) - Mathf.Atan2(a.y, a.x); 
    if (__angleCCW < 0f) __angleCCW += (2.0f * Mathf.PI); 

    float __angleCWviaatan = (2.0f * Mathf.PI) - __angleCCW; 
    __angleCWviaatan = __angleCWviaatan * (Mathf.Rad2Deg); 

    if (__angleCWviaatan >= 360.0) __angleCWviaatan = __angleCWviaatan-360.0f; 

    return __angleCWviaatan; 
    } 

not. Açıkçası "a" sadece (b-a) ve "b" dir

not sadece (c-a)


gerçek jest tanıma çok ileri araştırma alanı olduğuna dikkat edin olduğunu. Ben

https://www.assetstore.unity3d.com/en/#!/content/21660

https://www.assetstore.unity3d.com/en/#!/content/14458

hangi çaba
mühendislik-yıllık anlamıyla onlarca temsil orada çözümlerden birini almak için teşvik ediyoruz. PDollar harika (bu uygulama varlık deposunda bile ücretsiz!)

+0

sadece büyük teşekkürler bahsetmek istedim, ve gerçekten çok şey ifade ediyor. Referanslar ve karar vermek için ana denklem ile böyle detaylı bir düşünce. – lala

+0

Sadece daha fazla soru için bekliyorum dostum! Onlara burada bayrak atabilirsiniz – Fattie

0

Uuuups. Cevabımın cevabı tamamen yanlıştı. Vector3.Angle her zaman işaretsiz bir açı veriyor gibi görünüyor. Ama saat yönünde veya saat yönünün tersine dönüp dönmediğini anlamak için işarete ihtiyacımız var.

Şimdi, bu kod parçası iki vektörünüz arasında SIGNED açı verecektir. Normal argüman, düşünmek istediğiniz düzlem için normal olmalıdır.

float SignedAngle(Vector3 from, Vector3 to, Vector3 normal){ 

     float angle = Vector3.Angle(from,to); 
     float sign = Mathf.Sign(Vector3.Dot(normal, Vector3.Cross(from,to))); 
     float signed_angle = angle * sign; 

     return signed_angle; 
    } 
+1

no, Vector3.Angle her zaman 180 dereceden daha az bir pozitif açı verir. –