2017-03-03 25 views
0

これはtutorialと読んで正しく実行します。OpenGLでglviewport()を使用

しかし、私はいくつかの変更を加えたいと思っていました。最初の変更は、例えば円の1/4だけを表示するなど、その円の異なるビューを表示することでした。私はこれがglViewPort(パラメータ)によって行われることを知っています。ただし、パラメータを変更した後は何も起こりません。私はこの問題がなぜ発生するのかを理解するために多くのフォーラムをチェックしましたが、何も分かりませんでした。

誰かがこれについてもっと詳しく説明し、使い方を教えてもらえますか?

#include <GL/glut.h> 
#include <stdio.h> 
#include <math.h> 
#include<stdlib.h> 

void init(void) 
{ 
    glClearColor(1.0,1.0,1.0,0.0); 
    glMatrixMode(GL_PROJECTION); 
    //glLoadIdentity(); 
    gluOrtho2D(0.0,200.0,0.0,200.0); 
    //glViewport(0, 0, 250, 250); 
} 


void setPixel(GLint x,GLint y) 
{ 
    glBegin(GL_POINTS); 
    glVertex2i(x,y); 
    glEnd(); 
} 

void Circle(){ 

    int xCenter=100,yCenter=100,r=50; 
    int x=0,y=r; 
    int p = 3/2 - r; 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1 ,0, 0); 
    while(x<=y){ 
    setPixel(xCenter+x,yCenter+y); 
    setPixel(xCenter+y,yCenter+x); 
    setPixel(xCenter-x,yCenter+y); 
    setPixel(xCenter+y,yCenter-x); 
    setPixel(xCenter-x,yCenter-y); 
    setPixel(xCenter-y,yCenter-x); 
    setPixel(xCenter+x,yCenter-y); 
    setPixel(xCenter-y,yCenter+x); 

    if (p<0) 
    p += (2*x)+3; 
    else { 
p += (2*(x-y))+5; 
y -= 1; 
    } 
    x++; 
    } 

    glFlush(); 
} 

int main(int argc,char **argv){ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(0,0); 
    glutInitWindowSize(500,500); 


    glutCreateWindow("My Circl2e"); 
    init(); 

    glViewport(0,0,250,250); 
    //glLoadIdentity(); 

    glutDisplayFunc(Circle); 

    glutMainLoop(); 
    return 0; 
} 

PS:いくつかの例では、私は彼らが使用する参照SETWINDOW(パラメータ

を(問題が起こったかを理解するために)これは(もともとそのtutorialに書かれている)コード

コードです)glViewPort(パラメータ)を使用する前に。 setWindow()にはubuntuで利用できないライブラリが必要です。

答えて

2

デフォルトのGLUT reshape関数は、ウィンドウサイズを持つglViewport()を呼び出します。 documentationから:

リシェイプコールバックはウィンドウまたはNULLのために登録されていない場合は(以前に登録したコールバックを登録解除する)glutReshapeFuncに渡され、デフォルトのリシェイプコールバックが使用されています。このデフォルトのコールバックは、通常のプレーン(存在する場合はオーバーレイ)上のglViewport(0,0、width、height)を呼び出します。

glViewport()をあまりにも早く呼び出すので、呼び出し後に指定したビューポートを上書きしてウィンドウが整形されます。

独自の形状変更機能を登録し、glViewport()に希望のビューポートパラメータを指定して呼び出すか、Circle()機能の開始時にglViewport()を呼び出してください。

+0

ご返信ありがとうございます。私はcircle()関数の開始時にglViewport()を呼び出して、いくつかの変更が起こるのを見ました。今のところ、サークルのサイズを変更するだけです。たとえば、glviewPort(0、0、200、200)を設定した場合の円は、glViewport(0、0、100)に設定したときよりも2倍大きくなります。私がしたいのは、サークルの一部、たとえばその半分を見ることです。あなたは私を助けてくれますか?ありがとうございました – Kadaj13

関連する問題