2017-02-15 10 views
0

実行時にキューブの3辺が表示されるプロジェクトをOpenGL C++で作成しようとしています。 3面を見るために必要な回転はありません。私はOpenGLについて非常に新しいです、私の攻撃計画は今x、y、zの値を変更しています。私は2dで作業しても問題ありませんが、ミックスするためにzを追加することは、私を驚かせるものです。私は、負の値を使用するとカメラに近づくと正の距離に近い画像が表示されますが、下のコードではZ値を変更するとオブジェクトに何もしません。実行時に3辺を表示する3Dキューブを作成し、3辺をすべて表示するように回転しない

キューブ全体が描画される前に、ウィンドウの正しい位置にある2つのものを最初に取得しようとするだけで、前面と右側が表示されます(実行中)。もともと私はそれらを0.5または-0.5の点で描きましたが、それは画面上に矩形を生成するだけです。

私の主な質問は、各頂点の動作を予測する簡単な方法があるかどうかです。はい、私はグラフィカルな空間で作業していることは知っていますが、値が変更されたときに私のポイントが動かないのはなぜですか?

#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 
#include <stdlib.h> //For exit function 

void exit(int); //To Exit Program 

void init(void) 
{ 
    glClearColor (0.0, 0.0, 0.0, 1.0); 
    glColor3f(1.0, 1.0, 1.0); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 
} 


void cube() 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    glBegin(GL_QUADS); 

    glColor3f(1.0, 0.0, 0.0);  glVertex3f( 0.2, -0.3, -0.5);  // P1 is red lb 
    glColor3f(0.0, 1.0, 0.0);  glVertex3f( 0.3, 0.2, -0.5);  // P2 is green lt 
    glColor3f(0.0, 0.0, 1.0);  glVertex3f(-0.2, 0.3, -0.5);  // P3 is blue tt 
    glColor3f(1.0, 0.0, 1.0);  glVertex3f(-0.3, -0.2, -0.5);  // P4 is purple tb 

    glEnd(); 

// Green side - LEFT 
    glBegin(GL_QUADS); 
    glColor3f(0.0, 1.0, 0.0); 
    glVertex3f(-0.2, -0.3, 0.5); 
    glVertex3f(-0.3, 0.2, 0.5); 
    glVertex3f(-0.2, 0.3, -0.5); 
    glVertex3f(-0.3, -0.2, -0.5); 
    glEnd(); 

    glFlush(); 

} 

void myKeyboard(unsigned char theKey, int mouseX, int mouseY) 
{ 
    switch(theKey) 
    { 
     case 'Q': 
     case 'q': 
      exit(-1); //terminate the program 
     default: 
      break; // do nothing 

    } 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(640,480); 
    glutInitWindowPosition(100,150); 
    glutCreateWindow("Shapes: Q or q to quit"); 
    glutDisplayFunc(cube); 

    glutKeyboardFunc(myKeyboard); 

    init(); 
    glEnable(GL_DEPTH_TEST); 
    glutMainLoop(); 
} 

答えて

0

問題は頂点の動作ではなく、視点の代わりに正投影を使用しているという問題です。古くなったOpenGLの使用を継続したい場合は、glOrthoの代わりにgluPerspectiveが必要です。より現代的なOpenGLに移行したい場合は、すべての行列演算関数が削除されますので、代わりにglmのようなライブラリを使用してすべての計算を行う必要があります。

正射投影では、平行線が平行なままなので、水平線の点などはありません。それが矩形の前面のエッジの後ろにあるか平行であれば、それは見えません。遠近法の投影法は、カメラが世界をどのように見えるかに一層近似し、最終的には平行点が遠くに収束します。

これについて考える良い方法は、まっすぐな鉄道路線の非常に長い部分について考えることです。正射投影では、2本のレールが永遠にまっすぐに続くことがわかります。透視投影では、最終的には、2つのレールが遠くの単一の点で会合し、レールの内側の端を部分的に見ることができます。

+0

それはそれを置くのに最適です。それは挑戦的に私がそれをもっと理解するのを助けます。残念ながら、今はこれが学校の課題であり、私の教授はglOrthoを割り当てに使用させています。研究を見つけるために、私はほとんどの人がキューブを作成するために配列を使っているのを見つけました。私はそれほど助けを求めるのは難しいですね。古くなったバージョンを誰も使用していないので、 – csm60

+0

はい、即時モードは頂点配列に置き換えられました。ほとんどのコンピュータグラフィックスクラスはまだこのように教えるだろう。 –

+0

これはglOrthoを介してのみ完了することができる課題であれば、あなたが紛失している可能性があります。デフォルトでは、頂点の背面が間引かれます。背面は、時計回りまたは反時計回りのいずれかで頂点が指定された順序によって決まります。カリングを無効にするか、正面を他の方向に切り替えるか、すべてのクワッドが正しい順序で指定されていることを確認することができます。いくつかの詳細:https://www.khronos.org/opengl/wiki/Face_Culling –

関連する問題