• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Convert NSOpenGLView pixel coordinates to OpenGL world coordinates
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Convert NSOpenGLView pixel coordinates to OpenGL world coordinates


  • Subject: Re: Convert NSOpenGLView pixel coordinates to OpenGL world coordinates
  • From: Ian was here <email@hidden>
  • Date: Sun, 7 Oct 2007 18:08:24 -0700 (PDT)

I think that I was unclear about my intentions. I have
a two dimensional grid of 3D objects (each object is
at the same Z coordinate). Sorry if I was misleading.
Picking actually turned out to be the solution. I
found the following code to work. It's not optimized,
but does the job of returning the selected object.


- (void)clickedPoint:(NSPoint)p
{
	NSRect		viewBounds = [myView bounds];
	Scene		*myScene = [myView clientScene];
	NSArray		*sceneObjects = [myScene sceneObjects];
	GLsizei		bufferSize = (GLsizei)[sceneObjects count];
	GLint		        viewport[4];
	GLuint	        nameBuffer[bufferSize];


	glSelectBuffer( bufferSize, nameBuffer );
	glRenderMode( GL_SELECT );

	glMatrixMode( GL_PROJECTION );

	glPushMatrix();
	glLoadIdentity();

	glGetIntegerv( GL_VIEWPORT, viewport );
	gluPickMatrix( (GLdouble)p.x, (GLdouble)p.y, 3.0,
3.0, viewport );
	gluPerspective( 70.0,
viewBounds.size.width/viewBounds.size.height, 0.2,
100.0 );

	glMatrixMode( GL_MODELVIEW );
	glInitNames();

	[myScene render];   // Draw all objects.

        // NOTE: each object should have a glPushName(
(GLuint)name or ID ); before it gets rendered and a
GLPopName(); after it gets rendered.


	glMatrixMode( GL_PROJECTION );
	gluPerspective( 70.0,
viewBounds.size.width/viewBounds.size.height, 0.2,
100.0 );
	glPopMatrix();


	GLint		numberOfHits = glRenderMode( GL_RENDER );
	GLuint	*ptr = (GLuint *)nameBuffer;
	int		i;

	for ( i = 0; i < numberOfHits; i++ )
	{
		NSLog( @"%d", *(ptr + 3) );

		ptr += 4;	// Go to next record.
	}
}


Thanks for all your help Dave.




--- David Spooner <email@hidden> wrote:

>
> I hadn't put enough thought into my first response.
> When your initial
> post said you weren't concerned with the z-value, I
> thought you were
> using an orthographic projection.  Generally a point
> on the screen is
> the image of a line in world coordinates, so the
> z-value supplied to
> gluUnProject is significant and the arbitrarily
> chosen zero won't do.
> You will likely need to use your view-coordinate
> point to construct a
> line/ray in world coordinates and perform
> intersection testing on your
> geometry...
>
> You can use gluUnProject with two different z-values
> (say 0 and 1) to
> obtain two world coordinate points from which you
> form your world-
> coordinate line.  Regarding intersection testing, I
> have found a
> number of useful algorithms in "Geometric Tools for
> Computer Graphics"
> by Schneider and Eberly, and also in the usenet
> comp.graphics.algorithms faq
>
> Another alternative is to use GL's selection mode,
> which you can learn
> about in the chapter 'Selection and Feedback' of the
> Red book...
>
> dave
>
> On 7-Oct-07, at 2:25 PM, Ian was here wrote:
>
> >> From within the NSOpenGLView subclass...
> >
> >
> >
> > - (void)reshape
> > {
> > 	NSSize		viewSize = [self bounds].size;
> >
> > 	glViewport( 0.0, 0.0, viewSize.width,
> viewSize.height
> > );
> >
> > 	glMatrixMode( GL_PROJECTION );
> > 	glLoadIdentity();
> > 	gluPerspective( 70.0,
> viewSize.width/viewSize.height,
> > 0.2, 100.0 );
> > }
> >
>
>



      ____________________________________________________________________________________
Fussy? Opinionated? Impossible to please? Perfect.  Join Yahoo!'s user panel and lay it on us. http://surveylink.yahoo.com/gmrs/yahoo_panel_invite.asp?a=7

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Prev by Date: Individual Preference for Each Document
  • Next by Date: swapping textfields
  • Previous by thread: Re: Convert NSOpenGLView pixel coordinates to OpenGL world coordinates
  • Next by thread: Re: Convert NSOpenGLView pixel coordinates to OpenGL world coordinates
  • Index(es):
    • Date
    • Thread