在我的项目中..我随机移动opengl对象..如果我点击那个opengl对象..我需要获得该对象的中心位置..这是我的代码..
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if (objShowing == YES) {
NSLog(@"touch count %d",[touches count]);
UITouch *touchA,*touchB;
CGPoint pointA, pointB;
if ([touches count] == 1)
{
touchA = [[touches allObjects] objectAtIndex:0];
pointA = [touchA locationInView:self];
pointB = [touchA previousLocationInView:self];
float yDistance = pointA.y - pointB.y;
float xDistance = pointA.x - pointB.x;
GLfloat totalRotation = sqrt(xDistance*xDistance + yDistance*yDistance);
CATransform3D temporaryMatrix = CATransform3DRotate(currentCalculatedMatrix, totalRotation * M_PI / 180.0,
((xDistance/totalRotation) * currentCalculatedMatrix.m11 + (yDistance/totalRotation) * currentCalculatedMatrix.m12),
((xDistance/totalRotation) * currentCalculatedMatrix.m21 + (yDistance/totalRotation) * currentCalculatedMatrix.m22),
((xDistance/totalRotation) * currentCalculatedMatrix.m31 + (yDistance/totalRotation) * currentCalculatedMatrix.m32));
if ((temporaryMatrix.m11 >= -50.0) && (temporaryMatrix.m11 <= 50.0))
currentCalculatedMatrix = temporaryMatrix;
else
{
}
[self convert3DTransform:¤tCalculatedMatrix toMatrix:matrix];
[self adjustView];
}
}
}
-(void)adjustView{
NSLog(@"adjusting View");
[EAGLContext setCurrentContext:context];
glMatrixMode(GL_MODELVIEW);
glEnable(GL_NORMALIZE);
glLoadIdentity();
glScalef(_scale, _scale, 1.0f);
glRotatef(-90, 0.0f, 0.0f, 1.0f);
glRotatef(180, 0, 1, 0);
glClearColor(0.0f, 0.0f, 0.0f, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//Finally load matrix
glMultMatrixf(matrix);
glRotatef(0, 0, 0, 1);
glRotatef(-90, 1, 0, 0);
drawTeapot(codesiz);
glPopMatrix();
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
答案 0 :(得分:2)
OpenGL没有“持久性”。事情被吸引,事情被遗忘。基本上,OpenGL只是用于在一些名为“framebuffer”的纸上绘制的笔。仅此而已。因此,OpenGL本身无法满足您的要求。
您需要做的是自己跟踪您在单独结构中绘制的所有内容,并在您维护的此结构上进行此类测试和查询,例如您所询问的那些。