プロジェクトでは、NSOpenGLViewを実装する必要があります。私はいくつかのリソース(チュートリアル、リンゴのドキュメンテーション...)を見つけることができることを発見しましたが、gluPerspectiveとGluLookAtを使用しようとすると、私のキューブの頂点がぼんやりとしたような奇妙な振る舞いをしています。デプスバッファがない場合)。ここに私のOpenGLView(NSOpenGLViewクラス)の実装があります。gluPerspectiveとgluLookAtで異常な動作
注1:私のアプリケーションはOSX 10.6と互換性がなければなりません。OpenGL 2.1を使用する必要があります。
注2:Interface Builderは使用できません。私はプログラムでNSOpenGLViewを初期化する必要があります。
更新:gluPerspective zNearとzFar、およびgluLookAtアイパラメータが変更されて、トロンゲートされた頂点の問題を修正しました。しかし、正しく描かれない顔の問題はまだ残っています。ここで説明する画像は、次のとおりです。
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];
こんにちは!あなたの助言と説明に感謝します。 gluPerspective(45.0,1.0,1.0,10.0)、eyeパラメータを2.0に変更します。私は頂点の問題を解決しました。しかし、私はキューブのいくつかの顔が間違って描かれたり描画されたりしないので、深さバッファーの問題はまだ残っています。アイデア ? –
@JeffDolphin:奥行きバッファがないのでしょうか? NSOpenGLViewがデフォルトで提供するものは、私は気にしません。 – derhass
ありがとう、あなたは最初の問題の答えを見つけて、2番目の問題の答えを見つけるために私を向ける。 –