Direct3D الهندسة:دوران مصفوفة من اثنين من ناقلات
سؤال
نظرا اثنين 3D المتجهات A و B, أريد أن اشتقاق دوران المصفوفة التي تدور من أ إلى ب.
هذا هو ما جئت به:
- تستمد من جيب التمام
acos(أ .ب) - تستمد شرط من
asin(|أ × ب| / (|أ| * |ب|)) - استخدام A x B محور الدوران
- استخدام مصفوفة معينة بالقرب من أسفل هذه الصفحة (محور زاوية)
هذا يعمل بشكل جيد باستثناء تناوب 0° (الذي تجاهل) و 180° (التي تعامل على أنها حالة خاصة).هل هناك أكثر رشيقة طريقة للقيام بذلك باستخدام Direct3D المكتبة ؟ أنا أبحث عن Direct3D محددة الإجابة.
تحرير:إزالة acos و كمافي (انظر هيو ألن ما بعد)
المحلول
هو على الأرجح أكثر من خطأ مطبعي من thinko ، ولكن acos(أ. ب) زاوية ، وليس لها التمام.وبالمثل نقطة 2.
يمكنك حساب الخطيئة من كوس باستخدام sin^2 + جتا^2 = 1.هذا هو الخطيئة = الجذر التربيعي(1-cos*cos).هذا أرخص من ناقلات التعبير الذي تستخدمه ، و أيضا القضاء على الحالات الخاصة 0/180 درجة.
نصائح أخرى
لا تستطيع القيام بذلك بأفضل طريقة ممكنة.لا أعتقد أن هناك المدمج في DirectX وظيفة في أن يفعل ما تريد.الخطوة 4 ، يمكنك استخدام D3DXMatrixRotationAxis()
.فقط كن حذرا حول حافة الحالات, مثل عندما |أ| أو |ب| صفر ، أو عندما تكون زاوية 0 درجة أو 180 درجة مئوية.
كنت قد ننظر في المقالة التالية من سيغراف وصلة النص
ربما يمكنك استخدام D3DXMatrixLookAtLH ?