سؤال

أحتاج إلى حساب الزوايا 2 (YAW وملعب) لكائن ثلاثي الأبعاد لمواجهة نقطة ثلاثية الأبعاد تعسفية. تعرف هذه التناوب عن تناوب "Euler" ببساطة لأنه بعد الدوران الأول، (دعنا نقول Z، بناء على الصورة أدناه) يدور محور Y أيضا مع الكائن.

هذا هو الرمز الذي أستخدمه ولكن لا يعمل بالكامل. عند تشغيل الطائرة (y = 0)، يدور الكائن بشكل صحيح لمواجهة النقطة، ولكن بمجرد نقل النقطة لأعلى في Y، لا تبدو التناوب صحيحة.

// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards

yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )

هل تعرف كيف تحسب زوايا الأنبوبية 2 تعطى نقطة؟


تظهر الصورة أدناه الطريقة التي تنتجها. هذه هي الزوايا التي أحتاجها لحسابها. (الاختلاف الوحيد هو أن أدوير الكائن بالترتيب X، Y، Z وليس Z، Y، X)

pic

enter image description here


هذا هو نظامي.

  • تنسيق النظام هو X = إلى اليمين، Y = أسفل، Z = مرة أخرى
  • كائن افتراضي في (0،0،1) الذي يواجه للخلف
  • التناوب في الترتيب x، y، z حيث الدوران على x هو الملعب، y هو yaw و z هو لفة

my system

هل كانت مفيدة؟

المحلول

فيما يلي افتراضتي العملية:

  • نظام الإحداثيات (x، y، z) هو أن x الإيجابي x هو الصحيح، والإيجابية Y هو أسفل، و z هو الاتجاه المتبقي. على وجه الخصوص، Y = 0 هي الطائرة الأرضية.
  • يتم تحويل كائن في (0،0،0) الذي يواجه حاليا (0،0،1) إلى مواجهة (X، Y، Z).
  • من أجل تحقيق ذلك، سيكون هناك دوران حول محور X متبوعا واحدة حول المحور y. أخيرا، هناك دوران حول المحور Z من أجل الحصول على أشياء منتصبة.

(مصطلح ياو، الملعب، والفة يمكن مربكة، لذلك أود تجنب استخدامه، ولكن التحدث تقريبا المراسلات هو x = الملعب، Y = YAW، Z = لفة.)

هنا محاولتي لحل مشكلتك بالنظر إلى هذا الإعداد:

rotx = Math.atan2( y, z )
roty = Math.atan2( x * Math.cos(rotx), z )
rotz = Math.atan2( Math.cos(rotx), Math.sin(rotx) * Math.sin(roty) )

نأمل أن هذا صحيح حتى علامات. أعتقد أن أسهل طريقة لإصلاح العلامات هي عن طريق التجربة والخطأ. في الواقع، يبدو أنك حصلت على علامات rotx و roty صحيح - بما في ذلك مشكلة خفية فيما يتعلق z - لذلك تحتاج فقط إلى إصلاح تسجيل الدخول rotz.

أتوقع أن يكون هذا غير متوقع (ربما اعتمادا على الدكتورتي الذي أنت فيه)، لكن يرجى تجربة عدد قليل من الاحتمالات قبل أن تقول إنه خطأ. حظ سعيد!


هنا هو الكود الذي عمل أخيرا بالنسبة لي.

لقد لاحظت تأثير "الوجه" الذي حدث عندما انتقل الكائن من أي رباعي الأمامي (إيجابي Z) إلى أي رباعي الظهر. في الأرباع الأمامية أمامي من الكائن سيوجه دائما النقطة. في الأرباع الخلف الى الخلف من الكائن يواجه دائما النقطة.

هذا الرمز يصحح تأثير الوجه حتى مقدمة الكائن دائما يواجه النقطة. واجهت ذلك من خلال التجربة والخطأ لذلك أنا لا أعرف حقا ما يحدث!

 rotx = Math.atan2( y, z );
 if (z >= 0) {
    roty = -Math.atan2( x * Math.cos(rotx), z );
 }else{
    roty = Math.atan2( x * Math.cos(rotx), -z );
 }

نصائح أخرى

يظهر لك إجابة البائع الغنية كيفية تدوير نقطة من نظام إحداثي ثلاثي الأبعاد إلى نظام آخر، نظرا لمجموعة من زوايا Euler التي تصف التناوب بين أنظمة الإحداثيات.

ولكن يبدو أنك تطلب شيئا مختلفا:

لديك: إحداثيات 3-D لنقطة واحدة

تريد: مجموعة من زوايا euler

إذا كان هذا ما تطلبه، فلن يكون لديك معلومات كافية. للعثور على زوايا Euler، كنت بحاجة إلى إحداثيات لنقطتين على الأقل، في كل من أنظمة الإحداثيات، لتحديد دوران نظام إحداثي واحد في الآخر.

يجب أن تكون على دراية بأن زوايا Euler يمكن غموض بها: تفترض إجابة غنية يتم تطبيق الدورات على Z، ثم X '، ثم Z'، ولكن هذا غير محدد. إذا كان عليك الترابط مع بعض التعليمات البرمجية الأخرى باستخدام زوايا Euler، فأنت بحاجة إلى التأكد من أنك تستخدم نفس الاتفاقية.

قد ترغب في النظر في استخدام مصفوفات الدوران أو الأوامر بدلا من زوايا Euler.

هذه السلسلة من الدورات ستمنحك ما تسأل عنه:

  1. حول x: 0
  2. حول y: atan2 (z، x)
  3. حول z: atan2 (y، sqrt (x * x + z * z))

لا أستطيع أن أخبرك بما هو من حيث "لفة"، "الملعب" و "Yaw" ما لم تحدد أولا كيف تستخدم هذه الشروط. أنت لا تستخدمها بطريقة قياسية.

تعديل:
حسنا، ثم جرب هذا:

  1. حول x: -atan2 (Y، Z)
  2. حول y: atan2 (x، sqrt (y * y + z * z))
  3. حول z: 0

نتحدث عن دوران المحاور، وأعتقد أن الخطوة 3 يجب أن يكون دوران محاور X "و Y '' - و Z'-z'-axis.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top