إحداثيات OpenGL 2.0 ES
-
20-09-2019 - |
سؤال
أقوم بخطواتي الأولى مع OpenGL ES 2.0 أجرب الأشياء على جهاز iPod touch الخاص بي. كنت أتساءل عن كيفية حل هذه القضية الإحداثيات ..
لشرح أفضل ، كنت أحاول رسم رباعي وتدويره/ترجمته باستخدام تظليل قمة الرأس (أيضًا لأنه من ما قرأته يبدو أن الطريقة الوحيدة للقيام بذلك).
بما أنني أعمل مع جهاز iPod لدي 1.5 : 1
نسبة ومنفذ العرض بواسطة
glViewport(0, 0, backingWidth, backingHeight);
لذا 0,0
هل يجب أن يكون المركز وحدود القطع في -1.0, -1.0
, -1.0, 1.0
, ، إلخ (أليس كذلك؟)
لرسم مربع ، اضطررت إلى استخدام قيم مختلفة لإحداثيات X و Y بسبب نسبة العرض إلى الارتفاع:
static const GLfloat lineV[] = {
-0.5f, 0.33f, 0.5f, 0.33f,
0.5f, 0.33f, 0.5f,-0.33f,
0.5f,-0.33f, -0.5f,-0.33f,
-0.5f,-0.33f, -0.5f, 0.33f,
-0.5f, 0.33f, 0.5f,-0.33f,
0.5f, 0.33f, -0.5f,-0.33f,
};
إنه مربع مع كل من الأقطار (أعرف أن استخدام الفهارس سيكون أكثر كفاءة ولكن هذه ليست النقطة) ..
ثم حاولت كتابة تظليل قمة لتدوير الكائن أثناء تحريكه:
void main()
{
m = mat4( cos(rotation), sin(rotation), 0.0, 0.0,
-sin(rotation), cos(rotation), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
m2 = mat4(1.0);
m2[1][3] = sin(rotation)*0.8;
gl_Position = position*(m*m2);
}
إنه يعمل ولكن نظرًا لأن الإحداثيات ليست هي نفسها ، فسيتم تشويه الرباعية أثناء تدويرها. كيف يمكنني منع ذلك؟ اعتقدت أنه إذا كان من الممكن تغيير عرض الرؤية للحصول على حدود مختلفة (وليس -1.0 إلى 1.0 على كلا المحورين بحيث يؤدي التوسيع على المحور ص إلى إصلاح المشكلة).
بالإضافة إلى ذلك ، هل هناك طريقة أفضل لاستخدام المصفوفات؟ أعني ، كنت معتادًا على الاستخدام glRotatef
دون الحاجة إلى تحديد المصفوفة بأكملها .. هل توجد وظائف/منشئي الراحة لإنجاز هذه المهمة؟
المحلول 2
لا يتم توفير وظائف الوفرة أو الدعم مما رأيته. في الأساس ، قمت بحلها باستخدام إحداثيات متساوية عند إنشاء رؤوس واستخدام تظليل قمة الرأس لتوسيع نطاق محور Y بواسطة نسبة العرض إلى الارتفاع الصحيح.
نصائح أخرى
الحجج الأولى ل glViewport()
ليس المركز ، إنه إحداثيات الزاوية اليسرى السفلية.
ربما يجب عليك إعداد إسقاط يأخذ جانبك في الاعتبار ، وعادة ما تستخدم اللمعان () (إذا كان GLU متاحًا في ES).