我一直在靠墙撞墙几天。我已经阅读了every document我could find以及更多关于OpenGL和Cocoa的主题。我只是不明白我的尝试在哪里打破而其他人没有。
我的代码列在下面,它相当短,因为我要做的就是渲染一个旋转的三角形。我不是OpenGL或编程的新手,但我是Cocoa和Objective-C的新手。
MyOpenGL.h
#import <Cocoa/Cocoa.h>
@interface MyOpenGL : NSOpenGLView
{
float rot;
NSTimer *timer;
}
//+(NSOpenGLPixelFormat*) basicPixelFormat;
-(void) animTimer : (NSTimer *) timer;
-(void) drawRect : (NSRect) bounds;
@end
MyOpenGL.m
#include <OpenGL/gl.h>
#import <Cocoa/Cocoa.h>
#import "MyOpenGL.h"
@implementation MyOpenGL
/*
+ (NSOpenGLPixelFormat*) basicPixelFormat
{
NSOpenGLPixelFormatAttribute attributes [] = {
NSOpenGLPFAWindow,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)16,
(NSOpenGLPixelFormatAttribute)nil
};
return [[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease];
}
-(id) initWithFrame : (NSRect) frameRect
{
NSOpenGLPixelFormat * pf = [MyOpenGL basicPixelFormat];
return self = [super initWithFrame: frameRect pixelFormat: pf];
}
*/
-(void) awakeFromNib
{
rot = 0;
timer = [NSTimer timerWithTimeInterval: (1.0f/60.0f)
target:self
selector:@selector(animTimer:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];
}
-(void) animTimer : (NSTimer *) atime
{
[self setNeedsDisplay: YES];
[self drawRect:[self bounds]];
}
-(void) drawRect: (NSRect) bounds
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glRotatef(rot,1,0,0);
glBegin(GL_TRIANGLES);
{
glColor3f(1,0,0); glVertex3f(0,0.6,0);
glColor3f(0,1,0); glVertex3f(-0.2,-0.3,0);
glColor3f(0,0,1); glVertex3f(0.2,0.3,0);
}
glEnd();
glFlush();
rot++;
}
@end
取消注释标题中的+(NSOpenGLPixelFormat*) basicPixelFormat;
行以及.m文件中的关联函数和MyOpenGL.m文件中的-(id) initWithFrame : (NSRect) frameRect
方法似乎没有任何区别。
drawRect
方法似乎只调用一次。我得到了初始位置的三角形,但没有旋转。任何建议将不胜感激。
答案 0 :(得分:0)
我只是尝试将上面的代码放到一个新项目中,它对我有用。我看到一个围绕X轴旋转的三角形。您是否在-drawRect:方法上设置了断点?
BTW,发送-drawRect:如果您发送-setNeedsDisplay消息,则自己是多余的。