سؤال

لقد واجهت مؤخرًا بعض المشكلات في تطبيق ميزة التكبير في تطبيق الطلاء. واسمحوا لي أن أبدأ بإعطائك بعض المعلومات الأساسية.

أولاً ، بدأت بتعديل تطبيق Apple Glpaint التجريبي. أعتقد أنه مصدر رائع ، لأنه يوضح لك كيفية إعداد EAGLVIEW ، إلخ ...

الآن ، ما أردت القيام به بعد ذلك ، هو تنفيذ وظائف التكبير. بعد إجراء بعض الأبحاث ، جربت نهجين مختلفين.

1) استخدم Glorthof

2) تغيير حجم الإطار من EAGLVIEW الخاص بي.

على الرغم من أن كلا الاتجاهين تسمح لي بالتكبير / الخارج بشكل مثالي ، إلا أنني أواجه مشاكل مختلفة ، عندما يتعلق الأمر بالفعل بالطلاء أثناء التكبير.

عندما أستخدم (1) ، لا بد لي من تقديم عرض مثل هذا:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(left, right, bottom, top, -1.0f, 1.0f); //those values have been previously calculated
glDisable(GL_BLEND);
//I'm using Apple's Texture2D class here to render an image
[_textures[kTexture_MyImage] drawInRect:[self bounds]];
glEnable(GL_BLEND);
[self swapBuffers];

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

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

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

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

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

شكرا مقدما.

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

المحلول

نعم ، من الممكن بالتأكيد.

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

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

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

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

لتحويل الإحداثيات ، على افتراض أنه لا يمكنك أبدًا تصغير أبعاد الجهاز الكاملة في مكالمة Glortho () ، يجب عليك أن تتناسب مع نسب أبعاد ortho التي تم تكبيرها إلى أبعاد ortho غير المنحوية ثم تحيزها بالفرق بين قاع ortho المكبر ، والقيم اليسرى والقيم الخاصة بالقيم ortho الأصلية.

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