首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"MouseDragged“,但直到"MouseUp”才刷新NSOpenGlView

"MouseDragged“,但直到"MouseUp”才刷新NSOpenGlView
EN

Stack Overflow用户
提问于 2009-01-22 18:22:35
回答 1查看 1.2K关注 0票数 3

我有一个奇怪的问题,关于一个从NSOpenGlView继承MainView的应用程序。我可以在里面画很多东西,比如一个基本的OpenGL教程……但是当我尝试实现一个基本的轨迹球时,它看起来就像是应用程序要等到我松开鼠标按钮才会刷新我的视图……即使我直接从"MouseDragged“回调调用"DrawRect”回调,它的行为也是一样的。然后,我真的找不到如何做这样基本的事情,以及我的解决方案的问题是什么。

有什么想法吗?

我的NSOpenGLVIew有双缓冲,和和额外的深度缓冲。以下是主要信息。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代码语言:javascript
复制
- (void)mouseDragged:(NSEvent *)theEvent {

//[[self openGLContext] makeCurrentContext];


float curPos[3], dx, dy, dz;

dx = curPos[0] - lastPos[0];
dy = curPos[1] - lastPos[1];
dz = curPos[2] - lastPos[2];

angle = 90.0 * sqrt(dx*dx + dy*dy + dz*dz);
axis[0] = lastPos[1]*curPos[2] - lastPos[2]*curPos[1];
axis[1] = lastPos[2]*curPos[0] - lastPos[0]*curPos[2];
axis[2] = lastPos[0]*curPos[1] - lastPos[1]*curPos[0];

//glutPostRedisplay();

//[self drawRect:self.bounds]; // different attempts
[self setNeedsDisplay:YES]; //
//[self display]; 

}

#pragma mark Mouse Handling

- (void)mouseDown:(NSEvent *)theEvent {

m_PreviousMouseLoc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
ptov(m_PreviousMouseLoc.x,m_PreviousMouseLoc.y,m_width,m_height,lastPos);

}

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



- (void)mouseUp:(NSEvent *)theEvent {

[self setNeedsDisplay:YES];

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void ptov(int x, int y, int width, int height, float v[3]){

float a,d;

// project x,y onto  1/2 sphere  centered within width and height
v[0] = (2.0*x - width)/ width;
v[1] = (height - 2.0*y)/ height;
d = sqrt(v[0]*v[0] + v[1]*v[1]);
v[2] = cos((PI/2)*((d < 1.0) ? d : 1.0));
a = 1.0 / sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
v[0] *=a;
v[1] *=a;
v[2] *=a;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


 -(void)prepareOpenGL{

if( ![ self loadGLTextures ] ){
    NSLog(@"Failed to load GL Textures");
}


 GLint swapInt = 1;

 [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];     // set to vbl sync 


//glEnable( GL_TEXTURE_2D );                // Enable texture mapping
glShadeModel( GL_SMOOTH );                // Enable smooth shading
glClearColor( 0.0f, 0.0f, 0.0f, 0.5f );   // Black background
glClearDepth( 1.0f );                     // Depth buffer setup
glEnable(GL_DEPTH_TEST);                                // Enables Depth Testing
    glEnable (GL_BLEND);
glDepthFunc(GL_LEQUAL);                                 // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 


glPolygonOffset (1.0f, 1.0f);

firstOccurenceOfDrawRect = NO;


/* // set start values...
rVel[0] = 0.3; rVel[1] = 0.1; rVel[2] = 0.2; 
rAccel[0] = 0.003; rAccel[1] = -0.005; rAccel[2] = 0.004;*/

    [[self window] setAcceptsMouseMovedEvents: YES]; 

glViewport(0, 0, (GLsizei) self.bounds.size.width, (GLsizei) self.bounds.size.height);  
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 - (void) drawRect: (NSRect) rect
 { 
 ///    if (firstOccurenceOfDrawRect)
//  [self initGL];

 // On charge la matrice de projection pour définir ce que l'on va voir et comment
glMatrixMode(GL_PROJECTION);

// On centre
glLoadIdentity();

// On prend du recul
glOrtho(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f);

// On efface ce qui a été dessiné auparavant
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// On va maintenant définir ce que l'on veut dessiner
glMatrixMode(GL_MODELVIEW);


// Avant de commencer à dessiner, on va affecter de deux rotations le repère des coordonnées du cube pour le faire "bouger"
glLoadIdentity();
glRotatef(angle, axis[0], axis[1], axis[2]); 

//  [self resizeGL]; // forces projection matrix update (does test for size changes)
//  [self updateModelView];

    glColor3f (1.0, 1.0, 1.0); 
    glDisable(GL_CULL_FACE);
    glFrontFace(GL_CW);
    glutSolidTeapot(200.0);
    glFrontFace(GL_CCW);

    glEnable(GL_TEXTURE_2D);

    glBindTexture( GL_TEXTURE_2D, texture[ 0 ] );   // Select our texture

    glBegin( GL_QUADS );
    // Front
    glTexCoord2f( 0.0f, 0.0f );
    glVertex3f( -1.0f, -1.0f,  0.0f );   // Bottom left
    glTexCoord2f( 1.0f, 0.0f );
    glVertex3f(  1.0f, -1.0f,  0.0f );   // Bottom right
    glTexCoord2f( 1.0f, 1.0f );
    glVertex3f(  1.0f,  1.0f,  0.0f );   // Top right
    glTexCoord2f( 0.0f, 1.0f );
    glVertex3f( -1.0f,  1.0f,  0.0f );   // Top left
    glEnd();

    glBindTexture( GL_TEXTURE_2D, texture[ 1 ] );   // Select our texture

    glBegin( GL_QUADS );
    // side
    glTexCoord2f( 1.0f, 0.0f );
    glVertex3f(  0.0f, -1.0f, -1.0f );   // Bottom right
    glTexCoord2f( 1.0f, 1.0f );
    glVertex3f(  0.0f,  1.0f, -1.0f );   // Top right
    glTexCoord2f( 0.0f, 1.0f );
    glVertex3f(  0.0f,  1.0f,  1.0f );   // Top left
    glTexCoord2f( 0.0f, 0.0f );
    glVertex3f(  0.0f, -1.0f,  1.0f );   // Bottom left
    glEnd();


    glBindTexture( GL_TEXTURE_2D, texture[ 2 ] );   // Select our texture

    glBegin( GL_QUADS );
    // Top
    glTexCoord2f( 0.0f, 1.0f );
    glVertex3f( -1.0f,  0.0f, -1.0f );   // Top left
    glTexCoord2f( 0.0f, 0.0f );
    glVertex3f( -1.0f,  0.0f,  1.0f );   // Bottom left
    glTexCoord2f( 1.0f, 0.0f );
    glVertex3f(  1.0f,  0.0f,  1.0f );   // Bottom right
    glTexCoord2f( 1.0f, 1.0f );
    glVertex3f(  1.0f,  0.0f, -1.0f );   // Top right
    glEnd();

    glDisable(GL_TEXTURE_2D); 

 glColor3f (1.0, 1.0, 1.0); 
 glDisable(GL_CULL_FACE);
 glFrontFace(GL_CW);
 glutSolidTeapot(200.0);


[self postRemoteImage];

[[self openGLContext] flushBuffer];
}
EN

回答 1

Stack Overflow用户

发布于 2009-01-22 22:54:58

这是相关方法的完整代码吗?如果是这样的话,当你拖动的时候,你永远不会抓住鼠标的位置。curPos[]未初始化,可能会在每次收到mouseDragged:消息时返回相同的值。这可能会使对象始终旋转到同一位置,使其看起来不动。

尝试在mouseDragged:方法中插入一个NSLog,以确保它是为鼠标拖动调用的(可能是这样的,但最好检查一下)。

您可能没有给主run循环一个刷新显示的机会,但我认为这是不太可能的。我在我的代码中做了一些类似的事情,并且让它在主线程上的所有东西上都工作得很好。

我建议你看看Bill Dudney的trackball example code,而不是自己实现轨迹球。虽然它是用于iPhone并处理核心动画,但他使用的轨迹球对象应该适用于您的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/470285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档