كيفية رسم شغل في ظرف مثل مخروط على OpenGL (باستخدام تخمة)?

StackOverflow https://stackoverflow.com/questions/237899

  •  04-07-2019
  •  | 
  •  

سؤال

أنا باستخدام freeglut opengl التقديم...

أحتاج إلى رسم تغلف يبحث مثل مخروط (2D) التي يجب أن تكون مليئة بعض الألوان وبعض الشفافية تطبيقها.

هو freeglut أدوات مجهزة مع يحمل في ثناياه عوامل وظائف رسم شغل هندستها(أو بعض خدعة)?أم أن هناك بعض api الذي يحمل في ثناياه عوامل دعم يملأ هندستها..

Edit1: فقط لتوضيح 2D مخروط شيء...المغلف هو الرسومية تفسير منطقة التغطية من طائرة أثناء اعتراض(من طائرات العدو) .. يشبه القطاع من دائرة..كان يجب أن أذكر القطاع بدلا من ذلك..

و glutSolidCone لا يتلقى مساعدة لي كما أريد أن ألفت شغل في القطاع من دائرة...الذي قمت به بالفعل...ما تبقى القيام به هو ملء مع بعض الألوان...كيفية ملء هندستها مع اللون في opengl?

Edit2: كل الإجابات المنشورة على هذه الأسئلة يمكن أن تعمل على مشكلتي في طريقة..ولكن أنا بالتأكيد تريد أن تعرف كيف السبيل لملء الهندسة مع بعض اللون.أقول إذا كنت ترغب في رسم تغلف وهو القطع المكافئ...في هذه الحالة لن يكون هناك أي تقصير تخمة وظيفة في الواقع رسم شغل القطع المكافئ(أو هل هناك أي؟)..حتى أن نعمم هذا السؤال...كيفية رسم مخصص الهندسة في بعض الصلبة اللون ؟

Edit3: الجواب أن mstrobl نشر يعمل GL_TRIANGLES ولكن هذه المدونة:

glBegin(GL_LINE_STRIP);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

الذي يرسم مربع فقط سلكية مربع ويوجه... أنا بحاجة إلى ملء مع اللون الأزرق.

على أي حال أن تفعل ذلك ؟

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

أنا لا أعرف كيف من الممكن GL_TRIANGLES...ولكن كيف نفعل ذلك في أي منحنى مغلق?

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

المحلول

على Edit3:الطريق وأنا أفهم سؤالك أنك تريد أن يكون لها برنامج OpenGL رسم الحدود أي شيء بينهما يجب أن تكون مليئة الألوان.

الفكرة التي كان على حق ، ولكن خط غزة هو مجرد أن - شريط من الخطوط ، وأنه ليس لديه أي منطقة.

يمكنك بيد أن خطوط الاتصال مع بعضها البعض في تحديد مضلع.التي سوف ملء مساحة مضلع لكل قمة اساس.التكيف مع الكود الخاص بك:

glBegin(GL_POLYGON);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

يرجى ملاحظة أن رسم المضلع هذا الطريق اثنين من القيود:

  • المضلع يجب أن تكون محدبة.
  • هذا هو عملية بطيئة.

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

نصائح أخرى

أنا لا أفهم ما تقصد من "يأت" ، ولكن مخروط البدائية التي تخمة له:

glutSolidCone(radius, height, number_of_slices, number_of_stacks)

أسهل طريقة ملء مع اللون هو رسم اللون.منذ كنت تريد أن تجعل شفافة نوعا ما, تحتاج ألفا قيمة جدا:

glColor4f(float red, float green, float blue, float alpha)
// rgb and alpha run from 0.0f to 1.0f; in the example here alpha of 1.0 will
// mean no transparency, 0.0 total transparency. Call before drawing.

لتقديم translucently, مزج يجب أن يكون ممكنا.و يجب تعيين مزج وظيفة للاستخدام.ما تريد القيام به قد يتحقق التالية.إذا كنت تريد أن تتعلم أكثر من ذلك ، ترك لي تعليق و انا سوف ابحث عن بعض مؤشرات جيدة.ولكن هنا يذهب الإعداد الخاص بك:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

الدعوة التي قبل القيام بأي عمليات رسم, ربما في برنامج التهيئة.:)

منذ كنت reclarified سؤالك لطلب الفطيرة:هناك طريقة سهلة لرسم ذلك أيضا باستخدام opengl الأوليات:

كنت ارسم خالص المجال باستخدام gluSolidSphere().ومع ذلك, منذ كنت فقط أريد أن ألفت جزء منه فقط مقطع الأجزاء غير المرغوب فيها بعيدا:

void glClipPlane(GLenum plane, const GLdouble * equation);

مع طائرة GL_CLIPPLANE0 إلى GL_CLIPPLANEn و المعادلة كونها طائرة المعادلة في شكل طبيعي (ax + by + c*z + d = 0 يعني المعادلة يعقد القيم { a, b, c, d }.يرجى ملاحظة أن هذه هي الزوجي لا يطفو.

أتذكر كان هناك روتين ذلك.ولكن هذا ليس من الصعب جدا أن تفعل بنفسك.

ولكن أنا لا أفهم 2D شيء.مخروط في 2D?ليس هو فقط مثلث ؟

على أي حال, هنا خوارزمية رسم مخروط في opengl

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

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

الأولى فقط تقسيم قيمة عددية.بداية من [0-2] -مجموعة.تأخذ نقطة الوسط ((البداية+النهاية)/2) و تقسيم النطاق مع ذلك.تخزين القيم أزواج.على سبيل المثال, تقسيم مرة واحدة ينبغي أن تعطيك:[(0,1), (1,2)] تفعل هذا بشكل متكرر عدة مرات ، ثم حساب ما تلك النقاط هي على الدائرة.بسيطة المثلثات, فقط تذكر أن ضرب القيم مع π قبل المتابعة.بعد هذا لديك كمية معينة من الحواف.2^n حيث n هي كمية من التقسيمات الفرعية.ثم يمكنك ببساطة تحويلها إلى مثلثات من خلال منحهم قمة واحدة نقطة أكثر من ذلك.كمية من مثلثات ينتهي بالتالي:2^(ن+1).(المبالغ من المفيد أن نعرف إذا كنت تفعل ذلك مع حجم ثابت المصفوفات.

تحرير: ما كنت تريد حقا هو فطيرة.(عذرا على الوصف)

انها على حد سواء بسيطة لتقديم.يمكنك استخدامها مرة أخرى فقط مثلثات.فقط حدد العددية مجموعة [-0.25 - 0.25], تقسيم المشروع إلى دائرة ، وتوليد مجموعة من المثلثات.

Scalar - دائرة الإسقاط هو بسيطة مثل:س=جتا(v*pi)r, y=sin(vpi)*r حيث (x,y) هو نتيجة قمة المرحلة ، r هو نصف قطر الدوال المثلثية العمل على radiances ، وليس درجة.(إذا كانوا يعملون مع درجة محل بي 180)

استخدام vertex مخازن أو قوائم جعلها نفسك.

تحرير:عن التلوين السؤال.glColor4f ، إذا كنت تريد بعض أجزاء من الهندسة أن تكون مختلفة اللون ، يمكنك تعيين لون لكل قمة في قمة عازلة نفسها.لا الآن معرفة جميع المكالمات API للقيام بذلك ، ولكن API المرجعية في opengl غير مفهومة تماما.

على تعديل على الألوان:

برنامج OpenGL هو في الواقع آلة الدولة.وهذا يعني أن التيار المواد و/أو اللون موقف تستخدم عند رسم.منذ كنت على الارجح لن تكون باستخدام مواد تجاهل ذلك الآن.كنت تريد الألوان.

glColor3f(float r, float g, float b) // draw with r/g/b color and alpha of 1
glColor4f(float r, float g, float b, float alpha)

هذا سوف يؤثر على الألوان من أي القمم يمكنك رسم أي هندسة يمكنك تقديم - أن ذلك غلو أو الخاصة - بعد glColorXX الدعوة تم تنفيذها.إذا كنت رسم الوجه مع القمم و تغيير اللون في المنتصف glVertex3f/glVertex2f المكالمات الألوان محرف.

جرب هذا:

glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-3.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 3.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(3.0, 0.0, 0.0);
glEnd();

لكن أشار في glColor4f بالفعل ، لذلك أفترض أنك تريد أن مجموعة الألوان لكل قمة اساس.وأنت تريد أن تجعل استخدام عرض القوائم.

تماما مثل يمكنك عرض قوائم القمم, يمكنك أيضا جعل لهم قائمة من الألوان:كل ما عليك القيام به هو تمكين لون قوائم اقول opengl حيث قائمة يقيم.بالطبع, أنها تحتاج إلى نفس الزي مثل قمة قائمة (نفس النظام).

إذا كنت قد

glEnableClientState(GL_VERTEX_ARRAY);   
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glDisableClientState(GL_VERTEX_ARRAY);

يجب إضافة الألوان بهذه الطريقة.أنها لا تحتاج إلى أن تطفو.في الواقع, كنت أقول ما هو الشكل الذي ينبغي أن يكون.عن لون القائمة مع 1 بايت لكل قناة و 4 قنوات (R, G, B, A) استخدام هذا:

glEnableClientState(GL_VERTEX_ARRAY);   
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors_);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

تحرير:نسيت أن أضيف أن لديك ثم أخبر OpenGL العناصر التي رسم طريق الاتصال glDrawElements.

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