Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocoa和OpenGL茶壶未正确绘制_Objective C_C_Cocoa_Opengl_Glut - Fatal编程技术网

Objective c Cocoa和OpenGL茶壶未正确绘制

Objective c Cocoa和OpenGL茶壶未正确绘制,objective-c,c,cocoa,opengl,glut,Objective C,C,Cocoa,Opengl,Glut,我混合了Cocoa、GLUT和OpenGL框架来画茶壶。 我通常用普通的C语言来做这件事,但我需要把可可按钮和东西与OpenGL混合在一起,这是错误的C代码: #import <OpenGL/OpenGL.h> #import <GLUT/GLUT.h> #import <math.h> #include "utility.h" GLuint width=640, height=480; GLfloat angle=0.0; void init() {

我混合了Cocoa、GLUT和OpenGL框架来画茶壶。
我通常用普通的C语言来做这件事,但我需要把可可按钮和东西与OpenGL混合在一起,这是错误的C代码:

#import <OpenGL/OpenGL.h>
#import <GLUT/GLUT.h>
#import <math.h>
#include "utility.h"

GLuint width=640, height=480;
GLfloat angle=0.0;


void init()
{

    glEnable(GL_DEPTH_TEST);
    glViewport(-500, -500, 1000, 1000);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, width/(float)height, 1, 1000);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 0, -100, 0, 0, 0, 0, 1, 0);

    // Luci

    glShadeModel(GL_FLAT);

    glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat[]) {0,0,0} );
    glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat[]) {1,1,0} );
    glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat[]) {0.5,0.5,0} );

    glMaterialfv(GL_FRONT, GL_AMBIENT, (const GLfloat[]) {1,0,0} );
    glMaterialfv(GL_FRONT, GL_DIFFUSE, (const GLfloat[]) {1,0.25,0} );
    glMaterialfv(GL_FRONT, GL_SPECULAR, (const GLfloat[]) {1,0.75,0} );
    glMaterialfv(GL_FRONT, GL_SHININESS, (const GLfloat[]) {1,1,0} );

    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);

}

void display()
{
    glClearColor(BLACK);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
    glRotatef(angle, 0, 1, 0);
    glutSolidTeapot(10);
    glPopMatrix();

    glutSwapBuffers();
}

void keyboard(unsigned char key, int x, int y)
{
    if(key=='+')
    {
        angle+=5.0;
    }
    else if(key=='-')
    {
        angle-=5.0;
    }
    else
    {
        return;
    }
    makeRound(&angle);
    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(width, height);
    glutCreateWindow(argv[0]);
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    init();
    glutMainLoop();
    return 0;
}
#导入
#进口
#进口
#包括“utility.h”
胶接宽度=640,高度=480;
GLfloat角度=0.0;
void init()
{
glEnable(GLU深度试验);
GLV(-500,-500,1000,1000);
glMatrixMode(GL_投影);
glLoadIdentity();
透视图(45,宽度/(浮动)高度,11000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gluLookAt(0,0,-100,0,0,0,0,1,0);
//露西
glShadeModel(GLU平面);
glLightfv(GL_LIGHT0,GL_AMBIENT,(const GLfloat[]){0,0,0});
glLightfv(GL_LIGHT0,GL_DIFFUSE,(const GLfloat[]){1,1,0});
glLightfv(GL_LIGHT0,GL_镜面反射,(const GLfloat[]){0.5,0.5,0});
GLMATERIALV(GL_前部,GL_环境,(常数GLfloat[]){1,0,0});
glMaterialfv(GL_锋,GL_漫反射,(常数GLfloat[]){1,0.25,0});
glMaterialfv(GL_前沿,GL_镜面反射,(常数GLfloat[]){1,0.75,0});
glMaterialfv(GL_FRONT,GL_shinness,(const GLfloat[]){1,1,0});
glEnable(GL_LIGHT0);
glEnable(德国劳埃德大学照明);
}
无效显示()
{
glClearColor(黑色);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glPushMatrix();
glRotatef(角度,0,1,0);
茶壶(10);
glPopMatrix();
glutSwapBuffers();
}
无效键盘(无符号字符键,整数x,整数y)
{
如果(键=='+')
{
角度+=5.0;
}
否则如果(键=='-')
{
角度-=5.0;
}
其他的
{
返回;
}
makeRound(&角度);
再发现();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_深度| GLUT_双精度);
位置(100100);
glutInitWindowSize(宽度、高度);
glutCreateWindow(argv[0]);
glutDisplayFunc(显示器);
键盘Func(键盘);
init();
glutMainLoop();
返回0;
}
这就是结果:

然后我对NSOpenGLView进行子类化,并对这段C代码执行相同的操作,只是大小不同,但材质和灯光是相同的:

@implementation MyView

@synthesize angle;

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
    }
    return self;
}


- (void) prepareOpenGL
{
    NSOpenGLContext* context= self.openGLContext;
    GLfloat width= self.bounds.size.width;
    GLfloat height= self.bounds.size.height;

    [context makeCurrentContext];
    glEnable(GL_DEPTH_TEST);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, width/height, 1, 1000);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 0, -100, 0, 0, 0, 0, 1, 0);

    // Lighting

    glShadeModel(GL_FLAT);
    glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat[]) {0,0,0} );
    glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat[]) {1,1,0} );
    glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat[]) {0.5,0.5,0} );

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (const GLfloat[]) {1,0,0} );
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (const GLfloat[]) {1,0.25,0} );
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (const GLfloat[]) {1,0.75,0} );
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, (const GLfloat[]) {1,1,0} );
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);

}


- (void)drawRect:(NSRect)dirtyRect
{
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
    glRotatef(angle, 0, 1, 0);
    glutSolidTeapot(20);
    glPopMatrix();

    glFlush();
}

#pragma mark - Actions

- (IBAction) increaseAngle :(id)sender
{
    angle+=5.0;
    if(angle>360.0)
    {
        angle-=360.0;
    }
    [self setNeedsDisplay: YES];
}

- (IBAction) decreaseAngle:(id)sender
{
    angle-=5.0;
    if(angle<0.0)
    {
        angle+=360.0;
    }
    [self setNeedsDisplay: YES];
}

@end
@实现MyView
@综合角度;
-(id)initWithFrame:(NSRect)帧
{
self=[super initWithFrame:frame];
如果(自我)
{
}
回归自我;
}
-(无效)准备英语
{
NSOpenGLContext*context=self.openGLContext;
GLfloat width=self.bounds.size.width;
GLfloat height=self.bounds.size.height;
[上下文makeCurrentContext];
glEnable(GLU深度试验);
glMatrixMode(GL_投影);
glLoadIdentity();
透视图(45,宽/高,11000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gluLookAt(0,0,-100,0,0,0,0,1,0);
//照明
glShadeModel(GLU平面);
glLightfv(GL_LIGHT0,GL_AMBIENT,(const GLfloat[]){0,0,0});
glLightfv(GL_LIGHT0,GL_DIFFUSE,(const GLfloat[]){1,1,0});
glLightfv(GL_LIGHT0,GL_镜面反射,(const GLfloat[]){0.5,0.5,0});
GLMATERIALV(GL_前部和后部,GL_环境,(常量GLfloat[]){1,0,0});
glmaterialsv(GL_前面和后面,GL_漫反射,(常数GLfloat[]){1,0.25,0});
glMaterialfv(GL_前部和后部,GL_镜面反射,(常数GLfloat[]){1,0.75,0});
glMaterialfv(GL_前面和后面,GL_光泽,(const GLfloat[]){1,1,0});
glEnable(GL_LIGHT0);
glEnable(德国劳埃德大学照明);
}
-(void)drawRect:(NSRect)dirtyRect
{
glClearColor(0,0,0,0);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glPushMatrix();
glRotatef(角度,0,1,0);
茶壶(20);
glPopMatrix();
glFlush();
}
#pragma标记-动作
-(iAction)递增角度:(id)发送方
{
角度+=5.0;
如果(角度>360.0)
{
角度-=360.0;
}
[自我设置需要显示:是];
}
-(iAction)递减角度:(id)发送器
{
角度-=5.0;

如果(angle确保在创建GL上下文时请求深度缓冲区。默认情况下,您可能无法获得深度缓冲区。

确实,我没有创建NSOpenGLContext,我只是从NSOpenGLView(self.openGLContext)检索它。我正在NSOpenGLPixelBuffer中查找。如何启用深度?我在文档中找不到它。幸运的是,我能够通过xib文件执行此操作,在OpenGL视图的属性检查器中将深度设置为32位。