سؤال

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

أعلم أن الخطوة الأولى هي إيجاد أساس متعامد:

forward = direction of velocity vector
up = vector.new(0, 1, 0)
right = cross(up, forward) 
up = cross(forward, right)

كيف يمكنني تحويل الأساس إلى رباعي دوران؟

حل

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

   vec3 vel = direction of velocity vector
   vec3 forward = (1, 0, 0)  // Depends on direction your model faces. See below.
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit // Already facing the right direction!
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (0, axis.y * sin(theta/2), axis.z * sin(theta/2), cos(theta/2)

العنصر الأخير من الرباعية هو الجزء العددي، والعناصر الثلاثة الأولى هي الأجزاء التخيلية.أيضًا، يفترض الكود الزائف أعلاه أن الكائن الموجود في "مساحة النموذج" يشير إلى أسفل المحور السيني الموجب.في حالتي، كان الجسم يشير فعليًا إلى أسفل المحور الصادي الموجب، وفي هذه الحالة قمت بإجراء التغييرات التالية:

   vec3 vel = direction of velocity vector
   vec3 forward = (0, 1, 0)  // Note that y-component is now 1
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit 
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (axis.x * sin(theta/2), 0, axis.z * sin(theta/2), cos(theta/2)
   // Note that SECOND component above is now 0
هل كانت مفيدة؟

المحلول

أفترض أنك لا تهتم باتجاه مقذوفتك، بخلاف محاذاة المحور الطولي مع متجه السرعة، وأن المحور الطولي هو المحور x لـ (1، 0، 0).

كنت على الطريق الصحيح.قم بتطبيع متجه السرعة (vx، vy، vz)/sqrt(vx^2 + vy^2 + vz^2) عبر المحور x معه وقم بتطبيع النتيجة - (0, yn, zn) - هذا هو الدوران محور quaternion.زاوية الدوران هي ببساطة ثيتا = جيب التمام العكسي لـ vx/sqrt(vx^2 + vy^2 + vz^2).فإن quaternion الناتج هو ثم

(0، ين، الزنك) sn (ثيتا / 2) كوس (ثيتا / 2)

اسمحوا لي أن أعرف إذا كان لديك أي أسئلة.

Noel Hughes nhughes1ster@gmail.com

نصائح أخرى

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

سأكتب أيضًا اختبارات الوحدة للنتائج المتوقعة.من السهل جدًا الخلط بين الإطارات الإيجابية والسلبية، واليد اليسرى واليمنى، والإطارات المتحركة/المرجعية.ابدأ بالأشياء البسيطة (على سبيل المثال.xyz) للتأكد من أن لديك الإجابة الصحيحة.

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