Отображение координат из трехмерной проекции в двумерную ортографическую проекцию в OpenGL в C ++ - PullRequest
1 голос
/ 29 марта 2012

Я написал простую программу openGL на C ++.Эта программа рисует сферу в трехмерной перспективной проекции и пытается нарисовать линию, соединяющую центр сферы с текущей позицией курсора в 2D-ортогональной проекции.Теперь для рисования линии я не могу определить координату центра сферы.

Это мой код:

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

void passive(int,int);
void reshape(int,int);
void init(void);
void display(void);
void camera(void);

int cursorX,cursorY,width,height;

int main (int argc,char **argv) {
    glutInit (&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
    glutInitWindowSize(1364,689);
    glutInitWindowPosition(0,0);
    glutCreateWindow("Sample");
    init();
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutPassiveMotionFunc(passive);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}    

void display() {
    glClearColor (0.0,0.0,0.0,1.0);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //  Render 3D content
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,(GLfloat)width/(GLfloat)height,1.0,100.0);    // create 3D perspective projection matrix
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    camera();
    glTranslatef(-6,-2,0);
    glColor3f(1,0,0);
    glutSolidSphere(5,50,50);
    glPopMatrix();

    // Render 2D content
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width,height, 0);                 // create 2D orthographic projection matrix
    glMatrixMode(GL_MODELVIEW);
    glColor3f(1,1,1);
    glBegin(GL_LINES);
        glVertex2f( centreX,centreY );          // coordinate of center of the sphere in orthographic projection
        glVertex2f( cursorX,cursorY );
    glEnd();

    glutSwapBuffers();
}    

void camera(void) {
    glRotatef(0.0,1.0,0.0,0.0);
    glRotatef(0.0,0.0,1.0,0.0);
    glTranslated(0,0,-20);
}    

void init(void) {
    glEnable (GL_DEPTH_TEST);
    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_COLOR_MATERIAL);
}    

void reshape(int w, int h) {
    width=w; height=h;
}    

void passive(int x1,int y1) {
    cursorX=x1; cursorY=y1;
}

Я не могу вычислить значения для centreX иcentreY.В любом случае я могу получить правильные значения, чтобы нарисовать линию?

1 Ответ

3 голосов
/ 29 марта 2012

Возможно, вам будет интересно использовать что-то вроде gluProject для перехода от координат вашего объекта к фактическому (проецируемому) положению на экране. Если у вас есть экранные координаты объекта, можно легко провести линию от одной точки к другой.

В этом случае вам нужно спроецировать центральную точку сферы. Для более сложных объектов я обнаружил, что имеет смысл спроецировать все углы ограничивающего прямоугольника объекта, а затем взять экстенты положения экрана на этих углах.

Вы должны получить матрицу вида, видового экрана и матрицы проекции до того, как вы переключитесь на ортогональную проекцию (режим 2D).

Очевидно, что для перехода от позиции на экране (скажем, где вы щелкнули в окне) к мировой позиции, вы захотите использовать его вспомогательную функцию, gluUnProject.

Обратите внимание, что координаты, которые выходят из gluProject, не обязательно соответствуют непосредственно положению окна; возможно, вам придется перевернуть координату «Y».

Посмотрите на это обсуждение GDSE , чтобы найти другие идеи о том, как решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...