سؤال

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

شيء واحد ما زلت لا أتابعه تمامًا هو استخدام OpenGL للمصفوفات. أرى هذا (وأشياء مثل ذلك) كثيرًا:

x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

لذا فإن أفضل ما لدي ، هو أنها مصفوفة طبيعية (لا حجم) 4 أبعاد ، عمود. أيضا أن هذه المصفوفة على وجه الخصوص تسمى "مصفوفة الهوية".

بعض الأسئلة:

  • ما هو البعد "التاسع"؟
  • كيف ومتى يتم تطبيقها؟

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

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

المحلول

الإجابة المختصرة التي قد تساعدك على البدء هي أن البعد "التاسع" ، كما تسميه ، لا يمثل أي كمية يمكن تصورها. يتم إضافته كأداة عملية لتمكين مضاعفات المصفوفة التي تسبب الترجمة وإسقاط المنظور. لا يمكن لمصفوفة 3x3 بديهية القيام بهذه الأشياء.

يتم إلحاق القيمة ثلاثية الأبعاد التي تمثل نقطة في الفضاء 1 كقيمة رابعة لجعل هذه الخدعة تعمل. قيمة ثلاثية الأبعاد تمثل اتجاه (أي عادي ، إذا كنت على دراية بهذا المصطلح) يتم إلحاق 0 في المركز الرابع.

نصائح أخرى

في معظم الرسومات ثلاثية الأبعاد ، يتم تمثيل نقطة من خلال متجه مكون من 4 مكونات (x ، y ، z ، w) ، حيث تتضمن العمليات المعتادة المطبقة على نقطة الترجمة ، التحجيم ، الدوران ، الانعكاس ، منحرف ومزيج من هذه.

يمكن تمثيل هذه التحولات بواسطة كائن رياضي يسمى "المصفوفة". تنطبق مصفوفة على ناقل مثل هذا:

[ a b c tx ] [ x ]   [ a*x + b*y + c*z + tx*w ]
| d e f ty | | y | = | d*x + e*y + f*z + ty*w |
| g h i tz | | z |   | g*x + h*y + i*z + tz*w |
[ p q r s  ] [ w ]   [ p*x + q*y + r*z +  s*w ]

على سبيل المثال ، يتم تمثيل القياس على أنه

[ 2 . . . ] [ x ]   [ 2x ]
| . 2 . . | | y | = | 2y |
| . . 2 . | | z |   | 2z |
[ . . . 1 ] [ 1 ]   [ 1  ]

والترجمة كما

[ 1 . . dx ] [ x ]   [ x + dx ]
| . 1 . dy | | y | = | y + dy |
| . . 1 dz | | z |   | z + dz |
[ . . . 1  ] [ 1 ]   [   1    ]

أحد أسباب المكون الرابع هو جعل الترجمة ممثلة بواسطة مصفوفة.

تتمثل ميزة استخدام المصفوفة في أنه يمكن دمج التحولات المتعددة في واحدة عبر مضاعفة المصفوفة.

الآن ، إذا كان الغرض ببساطة هو إحضار الترجمة على الطاولة ، فأنا أقول (x ، y ، z ، 1) بدلاً من (x ، y ، z ، w) وجعل الصف الأخير من المصفوفة دائمًا [0 0 0 1], ، كما فعلت عادة للرسومات ثنائية الأبعاد. في الواقع ، سيتم تعيين ناقل المكون المكون من 4 مكونات إلى متجه 3-vector العادي عبر هذه الصيغة:

[ x(3D) ]   [ x / w ]
| y(3D) ] = | y / w |
[ z(3D) ]   [ z / w ]

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

على سبيل المثال ، نظرًا لأن الكائنات بعيدًا عن الشاشة يجب أن تكون أصغر على الشاشة ، فإننا نقوم بتحويل الإحداثيات ثلاثية الأبعاد إلى ثنائية الأبعاد باستخدام الصيغة

x(2D) = x(3D) / (10 * z(3D))
y(2D) = y(3D) / (10 * z(3D))

الآن إذا قمنا بتطبيق مصفوفة الإسقاط

[ 1 . .  . ] [ x ]   [  x   ]
| . 1 .  . | | y | = |  y   |
| . . 1  . | | z |   |  z   |
[ . . 10 . ] [ 1 ]   [ 10*z ]

ثم ستصبح الإحداثيات ثلاثية الأبعاد الحقيقية

x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1

لذلك نحن فقط بحاجة إلى تقطيع الإحداثي z إلى المشروع إلى 2D.

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