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

convert from windows coordinate to opengl coordina

بدأه EnigmaLine في 7 يوليو 2011 · 8 رد · 1,614 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

السؤال هنا مثلا انا لو عندى نقطة على الشاشة على نظام ابعاد الويندوز (X: 100 , Y: 130)

ازاى اقدر اعرف مكان النقطة دى على ابعاد الاوبن جى ال بالاخر فى الاعتبار البعد على الثلاث محاور( gltranslate(0,0,0 و منفذ الرؤية( viewport(0,0,w,h

طبعا انا لو غير الكود ده

( gltranslate(0,0,0

وخليتة

gltranslate(0,0,-5)

طبعا المفروض النقطة فى احداثيات الاوبن جى ال هاتتغير وهيا هيا نفس النقطه مش هاتتغير فى احداثيات الويندوز

#2
EnigmaLine كتب:

السلام عليكم ورحمة الله وبركاته

السؤال هنا مثلا انا لو عندى نقطة على الشاشة على نظام ابعاد الويندوز (X: 100 , Y: 130)

ازاى اقدر اعرف مكان النقطة دى على ابعاد الاوبن جى ال بالاخر فى الاعتبار البعد على الثلاث محاور( gltranslate(0,0,0 و منفذ الرؤية( viewport(0,0,w,h

طبعا انا لو غير الكود ده

( gltranslate(0,0,0

وخليتة

gltranslate(0,0,-5)

طبعا المفروض النقطة فى احداثيات الاوبن جى ال هاتتغير وهيا هيا نفس النقطه مش هاتتغير فى احداثيات الويندوز

اعكس ال glOrtho cordinates وستحصل على نفس احداثيات ال windows (اعكس ال Y Axis فقط)

#3
اقتباس

اعكس ال glOrtho cordinates وستحصل على نفس احداثيات ال windows (اعكس ال Y Axis فقط)

انا مش فاهم قصدك ايه بان اعكسه انا بستخدم glperpective بدلا من glortho علشان اللى اعرفه انه افضل منه

#4
EnigmaLine كتب:

انا مش فاهم قصدك ايه بان اعكسه انا بستخدم glperpective بدلا من glortho علشان اللى اعرفه انه افضل منه

ليس هنلك ما هو افضل او لا، بل مالذي تحتاجه انت ، لكل view mode عمل خاص يقوم به .

مثال لل perspective :

#include"windows.h"
#include"conio.h"
#include"iostream"
#include"Gl/gl.h"
#include"math.h"
#include"Gl/glu.h"
#include"Gl/glaux.h"
#pragma comment (lib,"OpenGL32.lib")
#pragma comment (lib,"glu32.lib")
#pragma comment (lib,"glaux")
int x=0;
void CALLBACK display(){
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(120,1,1,1000);
	gluLookAt( 0,0,-300, 0,0,300, 0,-1,0 );
	glClearColor(1,1,1,1);
	glViewport(0,0,600,600);
}
void CALLBACK movie(){
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glColor3f(1,0,0);
	glBegin(GL_LINES);
	glVertex3i(0,0,0);
	glVertex3i(100,100,0);	
	glEnd();
	auxSwapBuffers();
}
void main(){
	auxInitDisplayMode(AUX_RGB|AUX_DEPTH|AUX_DOUBLE);
	auxInitPosition(0,0,600,600);
	auxInitWindow(TEXT("3d"));
	auxIdleFunc(movie);
	auxMainLoop(display);
}
#5

تمام اللى انت كاتبه بس انا لو حطيت الكود ده

gltranslate(0,0,-5)

مكان النقطة هايتغير فى الاوبن جى ال ومش هايتغير فى احداثيات الوبندوز

#6

نستعمل الدالة التالية : gluUnProject

راجع المقال التالي

راجع الفصل :التمثيل في عالم الأوبن جي أل

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg
#7

انا غيرت الكود بتاعى واستخدمت الدالة دى glortho بدل من الدالة glperpective

وكل حاجة ظبت معايا تمم اوى بس المشكلة اللى ظهرتلى ان انا مش عارف اغير فى قيمة العمق يعنى لو عايز اعمل زووم

يعنى انا لو عندى الكود ده قبل لرسم

gltranslate(X,Y,Z)

لو حبيت اغير فى قيمة ال Z كل اللى مرسوم على الشاشة بيختفى يعنى كده مش هاعرف اعمل زووم

وده اكود اللى بستخدمه

glOrtho(0, w, 0, h, -1, 100);

تم تعديل هذه المشاركة بواسطة EnigmaLine في 12 يوليو 2011 في 03:17

#8
EnigmaLine كتب:

انا غيرت الكود بتاعى واستخدمت الدالة دى glortho بدل من الدالة glperpective

وكل حاجة ظبت معايا تمم اوى بس المشكلة اللى ظهرتلى ان انا مش عارف اغير فى قيمة العمق يعنى لو عايز اعمل زووم

يعنى انا لو عندى الكود ده قبل لرسم

gltranslate(X,Y,Z)

لو حبيت اغير فى قيمة ال Z كل اللى مرسوم على الشاشة بيختفى يعنى كده مش هاعرف اعمل زووم

وده اكود اللى بستخدمه

glOrtho(0, w, 0, h, -1, 100);

اولاً وقبل كل شيء اعرف اننا هنا لانهتم بال view perspective اي ان الجسم البعيد لن يبدو صغير.

اتحديد العمق اجعا z-= -1000 +z=1000

glOrtho(0, w, 0, h, -1000, 1000);

او اي قيمه تحتاجها

#9

السلام عليكم و رحمة الله.

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

لدى إستعمل الدالة :

int gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz,
const GLdouble modelMatrix[16],
const GLdouble projMatrix[16],
const GLint viewport[4],
GLdouble *objx, GLdouble *objy, GLdouble *objz);

هذه الدالة تعطي الإحداثيات للأوبن جي أل إستنادا إلى الإحداثيات في النافذة.

و العكس نستعمل الدالة التالية:

gluProject

و على فكرة , حين إستعمالgluUnProject & gluProject يتم تفاذي إستخدام الدالة gluLookAt .

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    // 
    glTranslatef(0.,0.,-0.2);
    glRotatef(45,1,1,0);
    glScalef(0.5,0.5,0.5);

    int x=5;
    GLdouble wx,wy,wz;
    GLint viewport[4];
    GLdouble mvmatrix[16], projmatrix[16];
    GLfloat realy;

    glGetIntegerv (GL_VIEWPORT, viewport);
    glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix);
    glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
    realy = viewport[3]-(GLint)y;

    printf ("Coordinates at cursor are (%4d, %4d)\n", x, (int)realy);
    // convert from window coordinates to opengl coordinates 
    gluUnProject ((GLdouble)x, (GLdouble)realy, (GLdouble)0,
            mvmatrix, projmatrix, viewport, &wx, &wy, &wz);

    glColor3f(1.,1.,1.);
         glPushMatrix();
            drawpointat(wx,wy,wz); // هنا إرسم أي شيء
         glPopMatrix();
    glFlush();
}

أتمنى التوفيق.

تم تعديل هذه المشاركة بواسطة 3ds max2010 في 12 يوليو 2011 في 18:30

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg

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