2016-04-24 5 views
0

プロジェクトでは、NSOpenGLViewを実装する必要があります。私はいくつかのリソース(チュートリアル、リンゴのドキュメンテーション...)を見つけることができることを発見しましたが、gluPerspectiveとGluLookAtを使用しようとすると、私のキューブの頂点がぼんやりとしたような奇妙な振る舞いをしています。デプスバッファがない場合)。ここに私のOpenGLView(NSOpenGLViewクラス)の実装があります。gluPerspectiveとgluLookAtで異常な動作

注1:私のアプリケーションはOSX 10.6と互換性がなければなりません。OpenGL 2.1を使用する必要があります。

注2:Interface Builderは使用できません。私はプログラムでNSOpenGLViewを初期化する必要があります。

更新:gluPerspective zNearとzFar、およびgluLookAtアイパラメータが変更されて、トロンゲートされた頂点の問題を修正しました。しかし、正しく描かれない顔の問題はまだ残っています。ここで説明する画像は、次のとおりです。

Capture01 Capture02

UPDATE 2:最後に、私は "働いていないOpenGLのGL_DEPTH_TEST" と題した質問を読んで答えを見つけました。ソリューションは次のとおりです。Interface BuilderなしでNSOpenGLViewを作成するには、プログラムでpixelFormatを設定する必要があります。私は同じ問題に遭遇した人のために自分のコードを修正します。

OpenGLView.m

#import "OpenGLView.h" 

@interface OpenGLView() 
{ 
    NSTimer *updateTimer; 
    float cubeRotationAngle; 
} 
@end 

@implementation OpenGLView 

-(id)initWithFrame:(NSRect)contentRect pixelFormat:(NSOpenGLPixelFormat *)format 
{ 
    if(self = [super initWithFrame:(NSRect)contentRect pixelFormat:format]) 
    { 
     [self setFrame:contentRect]; 

     updateTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(redraw) userInfo:nil repeats:YES] retain]; 
    [[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSRunLoopCommonModes]; 
    } 

    return self; 
} 

- (void)prepareOpenGL 
{ 
    [[self openGLContext] makeCurrentContext]; 
} 

- (void)drawRect:(NSRect)rect 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45.0, 1.0, 1.0, 10.0); 
    glEnable(GL_DEPTH_TEST); 

    glClearColor(1, 1, 1, 1); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    GLdouble eyeX = 2.0; 
    GLdouble eyeY = 2.0; 
    GLdouble eyeZ = 2.0; 

    GLdouble targetX = 0.0; 
    GLdouble targetY = 0.0; 
    GLdouble targetZ = 0.0; 

    GLdouble verticalVectorX = 0.0; 
    GLdouble verticalVectorY = 0.0; 
    GLdouble verticalVectorZ = 1.0; 

    gluLookAt(eyeX, eyeY, eyeZ, targetX, targetY, targetZ, verticalVectorX, verticalVectorY, verticalVectorZ); 

    cubeRotationAngle = cubeRotationAngle + 0.5; 
    glRotatef(cubeRotationAngle, 2.0, 0.5, 0.5); 

    float size = 0.4; 

    glBegin(GL_QUADS); 
    { 
     //Blue face 
     glColor3f(0, 0, 1); 
     glVertex3f(-1*size, 1*size, -1*size); 
     glVertex3f(1*size, 1*size, -1*size); 
     glVertex3f(1*size, -1*size, -1*size); 
     glVertex3f(-1*size, -1*size, -1*size); 

     //Red face 
     glColor3f(1, 0, 0); 
     glVertex3f(-1*size, -1*size, -1*size); 
     glVertex3f(1*size, -1*size, -1*size); 
     glVertex3f(1*size, -1*size, 1*size); 
     glVertex3f(-1*size, -1*size, 1*size); 

     //Green face 
     glColor3f(0, 1, 0); 
     glVertex3f(-1*size, 1*size, 1*size); 
     glVertex3f(1*size, 1*size, 1*size); 
     glVertex3f(1*size, -1*size, 1*size); 
     glVertex3f(-1*size, -1*size, 1*size); 

     //Yellow face 
     glColor3f(1, 1, 0); 
     glVertex3f(-1*size, 1*size, 1*size); 
     glVertex3f(-1*size, 1*size, -1*size); 
     glVertex3f(-1*size, -1*size, -1*size); 
     glVertex3f(-1*size, -1*size, 1*size); 

     //Pink face 
     glColor3f(1, 0, 1); 
     glVertex3f(-1*size, 1*size, 1*size); 
     glVertex3f(1*size, 1*size, 1*size); 
     glVertex3f(1*size, 1*size, -1*size); 
     glVertex3f(-1*size, 1*size, -1*size); 

     //light blue face 
     glColor3f(0, 1, 1); 
     glVertex3f(1*size, 1*size, -1*size); 
     glVertex3f(1*size, 1*size, 1*size); 
     glVertex3f(1*size, -1*size, 1*size); 
     glVertex3f(1*size, -1*size, -1*size); 
    } 
    glEnd(); 
    glPopMatrix(); 

    glFlush(); 
} 

- (void)redraw 
{ 
    [self setNeedsDisplay:YES]; 
} 

次に、あなたはこのようにOpenGLViewをインスタンス化する必要があります。

NSOpenGLPixelFormatAttribute attrs[] = {NSOpenGLPFADepthSize, 32, 0}; 

NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; 

openGLView = [[OpenGLView alloc] initWithFrame:NSMakeRect(20, 20, 760, 560) pixelFormat:format]; 

答えて

0

あなたgluPerspective呼び出しは無効であり、その結果として、単にエラーを発生させ、残します現在の行列は変更されません。 nearfarの両方のパラメータは、の正のである必要があります。また、同じであってはいけません(コメントの値が無効なため)。

これらの値は、投影中心から近景と遠景の符号付き距離を定義するため、負の値はカメラのの背後にあるを指します。カメラ平面と交差するプリミティブのクリッピングに関連するいくつかの問題)。

+0

こんにちは!あなたの助言と説明に感謝します。 gluPerspective(45.0,1.0,1.0,10.0)、eyeパラメータを2.0に変更します。私は頂点の問題を解決しました。しかし、私はキューブのいくつかの顔が間違って描かれたり描画されたりしないので、深さバッファーの問題はまだ残っています。アイデア ? –

+0

@JeffDolphin:奥行きバッファがないのでしょうか? NSOpenGLViewがデフォルトで提供するものは、私は気にしません。 – derhass

+0

ありがとう、あなたは最初の問題の答えを見つけて、2番目の問題の答えを見つけるために私を向ける。 –

関連する問題