الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اسئلة حول OpenGL

مغلق
بدأه الاخير زمانه في 19 فبراير 2006 · 6 رد · 1,596 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

كأي مبتدئ هناك العديد من الصعوبات التي تواجهنا في البداية و مجموعة من المشاكل ..

اولا ، بالنسبة للالوان

لو نرجع الى بيئة دوس و الرسم بأستخدام بورلاند سي او توربو سي

كان هناك ما يسمى palette و مجموعة من الدوال للتعامل معه وتغيير محتواه واعطاء قيمة للالوان الاساسية لينتج اللون المطلوب ، تحديدا الدالة

setrgbpalette(pal.colors[0], R_color , G_color,B_color)

و كان كل من R و G و B يأخذ من 0 الى 63 احتمال ، يعني كان عدد احتمالات الالوان هي 63*63*63

(طبعا لغة سي في بيئة دوس كانت لا تدعم سوى 16 لون ، بأستثناء طرق معينة لزيادة عدد الالوان )

اما في ويندوز ، عدد احتمالات الالوان 256*256*256 ولدينا ما يدعى ب DAC

المهم ، الان في OpenGL .. اش ينطبق عليه ؟؟؟

يعني انا لاحظت دالة الالوان هي

glclearcolor ()
glcolor3f();

و احتمالية اللون الواحد من 0 الى 1 (كما قرأت في دروس اخونا علي رحمهُ الله )

طيب كيف هذا ؟؟

يعني عدد الاحتمالات 10*10*10 .. يعني اقل من الاحتمالات في بيئة دوس !!!!! مستحيل

ارجو التوضيح ، وهل هناك طرق اخرى للتعامل مع الالوان ؟؟؟؟؟؟

ثانيا ..

الدالة  glOrtho()

ماذا تعني ؟؟

بصراحة انا قرأت عنها بس ما افتهمت !!!

طيب ، في OpenGL بالنسبة للاحداثيات كيف تكون

يعني النقطة (0,0) اين موقعها ، هل في الزاوية العليا اليسرى كالعادة

و الدالة glLoadIdentity () التي تعيد الى منتصف الشاشة ، يعني هل في المنتصف ستكون النقطة (0,0) ، و اذا لم تستخدم الدالة اين ستكون نقطة البداية ؟

(بس ليش عند حذف هذه الدالة يظهر الرسم بسرعة ثم يختفي !!)

و بخصوص الدالة glTranslatef

مثلا في دروس الاخ علي رحمه الله

glTranslatef(-1.5f, 0.0f ,-6.0f);

هذه الدالة للحركة ( عند حذفها لا يظهر الرسم ؟؟؟؟؟؟؟!!)

الشاشة مقسمة الى مجموعة من النقاط pixel ، مثلا لو نستخدم الدلة MoveTo(10,20) الموجودة في لغة سي سوف نذهب الى النقطة (20,10) على الشاشة ،

يعني الارقام واضحة ، طيب بخصوص الدالة glTranslatef الارقام ماذا تمثل ، يعني ( -1.5)

بمعنى اخر .. ما هي وحدة القياس ( 1.5 شو )

و حتى الدالة glVertex3f() المستخدمة لرسم نقطة ، كيف يمكن اعطاء نقطة كـ float ؟ و ما هي اكبر قيمة ممكن اعطاءها للنقطة .

يعني من الاخر ، كيف يتعامل ال OpenGL مع الشاشة ؟؟

و بخصوص الدالة glVertex3f تستخدم لرسم نقطة .. مثلا في دروس الاخ علي رحمه الله قام برسم مثلث وحدد بهذه الدالة الرؤوس الثلاثة للمثلث فتم رسم مثلث مملوء .. طيب كيف ممكن رسم مثلث فارغ (يعني فقط الحدود) ، هل توجد دالة مثل line ؟

اكيد طولت عليكم ..

بارك الله فيكم

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

السلام عليكم

اخى انا مازلت مبتدئ مثلك تماما ولا اعلم معظم الدوال ولكن ما اعلمه هو ان فى دوال الالوان يتم ضرب القيمة فى 256

#3

اخي ، هناك عدة انظمة للالوان و تختلف علي حسب العتاد ، فمثلاً جهاز الالعاب السيجا كان يعمل علي 16 بت...

palette مصفوفة الوان و تحتوي عل 256 لون و هي نظام 8 بت 2^8 = 256 لون ـ لكل بكسل 8 بت .

هناك انظمة بعدها مثل 16 ، 24 ، 32 ... إلخ و هي لها نظام اخر بحيث اصبح هناك تفعيل لخليط الالوان RGB - لكل نظام هناك نمط لحجم البكسل لكل قناة من الالوان الثلاثة .. مثل نظام 16 بت - الاحمر 5 بت ، الاخضر 6 بت ، الازرق 5 بت , و علي ذلك الانماط الاخري 8 بت لكل قناة تعطي نظام 24 بت .

الDAC هو عبارة عن Digital To Analog Converter بعيداً عن التطرق للالكترونيات هو عبارة عن بلوك من الدوائر الالكترونية تقوم بتحويل القيم الرقمية التي تعبر عن الالوان و تحولها لقيم تناظرية يقوم برسمها المسدس الالكتروني ( طبعاً هذا البلوك موجود بكارت الشاشة و موصل بالشاشة التي تحتوي علي المعلومات التزامن الرأسي و الافقي للرسم ...إلخ ) .

اخي ، glOrtho()

Orthogonal Projection تعني إسقاط عمودي ، اخي إنظر إلي الالعاب الثلاثية الابعاد تري المجسم مسقوط علي الشاشة الثنائية البعد ، هذا التحويل يُسمي بالاسقاط العمودي ، هناك إثبات رياضي له تشابه مثلثات إلخ من الرياضة .

هناك إسقاط اخر اسمه الاسقاط المنظوري Perspective Projection و هو اسقاط في الثلاثة ابعاد تخيل انك تمشي في الشارع ستري انك كلما قربت تقرب المباني و كلما بعدت تبعد المباني ...

هناك اسقاط اخر الاسقاط الايزومتري Isometric Projection و هو ما يستخدم في الالعاب الاستراتيجي و تكون هناك زاية للرؤية غالباً 45 درجة ( لما كنت ادرس الرسم الهندسي كنا نستخدم 30 درجة ) ..

هناك إسقاطات اخري يستخدمها المعمارين في التصميم .

يعني الارقام واضحة ، طيب بخصوص الدالة glTranslatef الارقام ماذا تمثل ، يعني ( -1.5)

بمعنى اخر .. ما هي وحدة القياس ( 1.5 شو

المقياس هو البكسل ... تتحرك 5 بكسل علي الشاشة فوق او تحت من اعلي يسار الشاشة .

دالة glLoadIdentity ()

Identity تعني الوحدة و هنا تقوم بإعادة الرسم إلي متجه الوحدة علي المحور السيني و هو 100

و الصادي 010 و العيني 001

حتى الدالة glVertex3f() المستخدمة لرسم نقطة ، كيف يمكن اعطاء نقطة كـ float ؟ و ما هي اكبر قيمة ممكن اعطاءها للنقطة .

يعني من الاخر ، كيف يتعامل ال OpenGL مع الشاشة ؟؟

اعجبتني اسألتك ، اخي انت تريد ان ترجع لوراء لمعرفة ما وصل إليه OpenGL :) .. اكبر قيمة هي اكبر قيمة لنوعية البيانات float .

.. طيب كيف ممكن رسم مثلث فارغ (يعني فقط الحدود) ، هل توجد دالة مثل line ؟

اخي راجع دروس الاخ الشمري في المنتدي .

تعبئة المثلث هي عملية تعبئة خط بخط يقوم بعملها OpenGL :) .

احمد

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#5
اقتباس
(( اعجبتني اسألتك  ))

المهم انك ما ضجرت !!

استاذي الكريم ..

ممكن تتعب معاي شوية .. اصل فهمي ثقييييييييييل !

يعني اولا بالنسبة ل palette .. هو تابع للغة ام لنظام التشغيل ..

ال palette هو واحد ما في غيرة .. تمام ..

اقتباس
((  palette مصفوفة الوان و تحتوي عل 256 لون و هي نظام 8 بت 2^8 = 256 لون ـ لكل بكسل 8 بت . ))

طيب اخبرني مدى صحة المعلومات التالية …

حسب علمي ال palette يتكون من 16 رجستر .. و كل رجستر يتكون من ثلاث اجزاء و كل جزء هو عبارة عن 6 bit و هذه الاجزاء هي الالوان الاساسية RGB …

ثانيا ..

اقتباس
(( طبعاً هذا البلوك موجود بكارت الشاشة و موصل بالشاشة  ))

طيب اذا كانت الحاسبة built in ( ولو دخلنا في hardware)

ثالثا ..

	glTranslatef(-1.0f,0.0f,-6.0f);

(( المقياس هو البكسل ))

يعني .. حسب المثال الي عندي .. مستحيل بكسل (الدالة التي في الاعلى )

لأن اذا فقط غيرت -1 الى 0 سيتجه الرسم كثيرا وبصورة ملحوظة الى جهة اليمين .. طبعا لو كان بكسل كان اساسا لا نلحظ تغير الشكل اذا حركناه بمقدار بكسل .. تمام ؟؟

اضف الى هذا .. عندما نقول 1.5 .. يعني معقولة بكسل ونص .. و اش راح تفرق ؟؟

..

اقتباس
((اكبر قيمة هي اكبر قيمة لنوعية البيانات float .      ))

طيب كيف .. مش المفروض اكبر قيمة تعتمد على احداثيات الشاشة .. تمام .. لأن الرسم داخل الشاشة ..

يعني اكبر قيمة هي اخر نقطة في الشاشة ..

بس انا اريد اعرف احداثيات الشاشة ..

يعني بصراحة عي صير عندي الباس بشاشة الويندوز .. يعني مثلا لو اننا نرسم في النقطة 10,10 وبعد التنفيذ عملناmaximize للنافذة .. ماذا سيحصل لأحداثيات النقطة ؟؟

اقتباس
((( هل توجد دالة مثل line ؟

اخي راجع دروس الاخ الشمري في المنتدي .  )))

بصراحة .. ما لقيت شي .. هي ما شاء الله الدروس كثيرة .. سأحاول ان ابحث مرة اخرى ..

اقتباس
((( تعبئة المثلث هي عملية تعبئة خط بخط يقوم بعملها OpenGL  )))

اظن هذا تابع لقوانين Area Filling .. تمام ..

هذا بالنسبة للأشكال المتظمة .. طيب للأشكال الغير المنتظمة ..

اي خوارزمية يتم التطبيق .. بالنسبة ل OpenGL

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#6
اقتباس
لأن اذا فقط غيرت -1 الى 0 سيتجه الرسم كثيرا وبصورة ملحوظة

الى جهة اليمين .. طبعا لو كان بكسل كان اساسا لا نلحظ تغير الشكل اذا حركناه بمقدار بكسل .. تمام ؟؟

اضف الى هذا .. عندما نقول 1.5 .. يعني معقولة بكسل ونص .. و اش راح تفرق ؟؟

سؤال جدا ممتاز :) ,,

اولا انظر هنا :

http://204.157.36.16/index.php?showtopic=83823

وللتبسيط .

الاححداثيات في opengl انت الذي تتحكم فيها ,,

في الاصل :

نقطة المنتصف في الشاشة هي نقطة الصفر ,,

مثل الاحداثيات التي ندرسها في المدرسة بالظبط ,,

وايمن نقطة في الشاشة تاخذ قيمة واحد تقريبا ,,

والايسر -1 تقريبا ..

وكذلك الاعلى و الاسفل ..

لكن تستطيع ان تغير هذه الاححداثيات كما تريد عن طريق الدالة glortho ,.,

ةلكن هذه الدالة لاتعمل مع الثريدي .,,

مثلا لو اردت الاحداثيان مثل احداثيات الويندوز .. اي ايسر نقطة = 0

ايمن نقطة = 800بيكسل

اعلى نقطة صفر بكسل

اسفل نقطة 600 بيكسل ,,

تقوم بشيء مشابه للتالي على ما اذكر ,,

gluOrtho2d(0,800,600,0);

هذه تضعها بدلا من الدالة gluPerspective

الان تحرك كما تريد .. لكن لاحظ ان Z دائما صفر والا لن يظهر الرسم .,,

طيب لنفرض انك تريد التحريك في عالم ثلاثي الابعاد .,, وبدون قيود ..

قم بوضع المجسم في عمق الشاشة .. ثم تحرك كما تريد

مثلا

glLoadIdentity();
glTranslatef(12,5,-40);

بالنسبة للمثلث .. وحدوده ..

هنا

http://204.157.36.16/index.php?showtopic=83784

وتحديدا ستجد الشرح في الردالثالث ..

الرسم بطريقة GL_TRIANGLES

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…