2012-04-21 29 views
-1

3D座標を画面座標に変換する際に問題があります。球の中心を画面座標に変換する必要があります。私のコードはここにあります:OpenGLで3D座標を画面座標に変換

// OpenGL problem 

#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; 
double centerX,centerY,centerZ; 
//GLfloat modelviewMatrix[16],projectionMatrix[16]; 
GLdouble modelviewMatrix[16],projectionMatrix[16]; 
GLint viewport[4]; 

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(); 

    glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix); 
    glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix); 
    glGetIntegerv(GL_VIEWPORT, viewport); 
    // get 3D coordinates based on window coordinates 
    gluProject(-6, -2, 0, modelviewMatrix, projectionMatrix, viewport, &centerX, &centerY, &centerZ); 

    // 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(centerX,centerY);   // 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; 
} 

私のコードでは、centerXとcenterY座標が画面外に出ています。私は、球の中心とマウスポインタの間に線を引く必要があります。コードを変更して正しく動作させるには?

+1

どのようにこれはと何が違うのである[質問の解像度を確認するための私の機能あなたは先月に尋ねた?](http://stackoverflow.com/questions/9926763/mapping-coordinates-from-3d-perspective-projection-to-2d-orthographic-projection) –

+0

そのスレッドへの回答は1つしかありませんでした。試してみましたが、うまく動作しませんでした。コードは、そのスレッドで提案された内容を含むように変更されています。まだ奇妙な結果を得る。 –

+0

良い答えが得られなかったという理由だけで、同じ質問をし続けることはありません。 –

答えて

0

通常、3D/2D座標を切り替える機能を使用します。それがあなたのために働くかどうか見てください。

void toggle2DMode(bool flag, GLint Width, GLint Height) const 
{ 
     if(flag) 
     { 
       glMatrixMode(GL_PROJECTION); 
       glPushMatrix(); 
       glLoadIdentity(); 

       glOrtho(0.0, Width, Height, 0.0, -1.0f, 1.0f); 
       glMatrixMode(GL_MODELVIEW); 
       glPushMatrix(); 
       glLoadIdentity(); 
       glDisable(GL_DEPTH_TEST); 
       glEnable(GL_BLEND); 
     } 
     else 
     { 
       glMatrixMode(GL_PROJECTION); 
       glPopMatrix(); 
       glMatrixMode(GL_MODELVIEW); 
       glPopMatrix(); 
       glEnable(GL_DEPTH_TEST); 
       glDisable(GL_BLEND); 
     } 
} 
+0

私の質問を再構成させてください。 3D座標系に点x、y、zがある場合、その対応するx、yは画面座標系上で何ですか? –

+0

単に[gluProject](http://www.opengl.org/sdk/docs/man/xhtml/gluProject.xml)機能を使用してみましたか?関数定義:オブジェクト座標をウィンドウ座標にマップする – Chris911

+0

上記のコードでgluProjectを使用しました。それは奇妙な結果をもたらします。 gluProjectが返すx、y、z値が画面外にありました。私は、マウスの位置(2D)と球の中心(3D)が同じ座標系にあることを望んでいました。 3Dを2Dに変換できませんでした。 しかし、今は2Dマウス座標を3D座標系に変換することができました。これは私の問題を解決しました。 NeHeのチュートリアルからコードを選んだ。 私の更新コード:(gluUnProjectを使用して2Dから3Dにカバーする): [link](http://pastebin.com/PSSkkJJV) –

0

クワッド

void WINDOW_TEXT::calcResolution(GLshort & x , GLshort & y) 
{ 
    GLdouble tx, ty, ttx, tty, z; // target 2d coords (z is 'unused') 

    GLdouble model_view[16]; 
    glGetDoublev(GL_MODELVIEW_MATRIX, model_view); 

    GLdouble projection[16]; 
    glGetDoublev(GL_PROJECTION_MATRIX, projection); 

    GLint viewport[4]; 
    glGetIntegerv(GL_VIEWPORT, viewport); 

    // get window coords based on 3D coordinates 
    gluProject(up_right.x, up_right.y, up_right.z, 
       model_view, projection, viewport, 
       &tx, &ty, &z); 

    gluProject(down_left.x, down_left.y, down_left.z, 
       model_view, projection, viewport, 
       &ttx, &tty, &z); 

    x = (GLshort)(tx-ttx); 
    y = (GLshort)(tty-ty); 
}; 

「Z」が無視され、あなたがXに保存されている純粋な解像度を得る、とy

関連する問題