Creating a line in perspective mode that points into the screen?

Started by
1 comment, last by WhatEver 21 years, 2 months ago
This one is a bit hard to explain so I''ll do the best I can. I want to select triangles in perspective mode. In order to do that I want to project a ray using the camera matrix, so that when drawn in perspective mode, you will only see a pixel drawn. This means the the starting and ending point of the ray is perpendicular to the screen. Usually the ray would move towards the center of the screen the further the point was away due to the perspective, but I don''t want it to do that. If I could somehow reverse the effect of the projection matrix so that instead of the point moving towards the center of the screen it would move away from the center of the screen. This would give me a ray that when I picked a point on the screen I would get a resulting ray that would interesct a triangle . I know that gluUnProject works when you only want to do it with a single point tangent to your view, but I can''t get it to do a second point that is suppose to go into the screen a certain distance. I hope that made sense to someone .
Advertisement
Just to add a little bit of detail, I would do it like this if I had the right ProjectionMatrix

Step 1:
Multiply the Start and End point of my ray in world space with my Cameras inverse matrix.

Step 2:
Now that the ray is relative to the Camera, I can multiply the Start and End points with a Projection matrix that makes vertices move away from the center of the screen instead of towards when the vertex is moving away.

Step 3:
Multiply the newly projected Start and End points of the ray by the Camera matrix.

When you draw the Start and End points they should only be a pixel on the screen.

Is the near plane the width and height of the viewport?
Here is the source code I had written a while back and just gave up on because it wouldn't work. I don't know how to make the projection matrix have the reverse effect I mention above in my other post.


      /*	This function should create a point in world space that will render right on top	of your mouse cursor	This function, when it's working, is good for selecting objects in world space in 	perspective mode.*/S3Dvoid s3d_camera::ScreenToWorld(S3Dfloat xin, S3Dfloat yin, S3Dfloat zin, S3Dfloat* xout, S3Dfloat* yout, S3Dfloat* zout){	S3Dmat16f	CameraMat;	S3Dmat16f	CameraInverseMat;	S3Dmat16f	ProjectionInversMat;	S3Dvec3f		VecUp;	S3Dvec3f		VecForward;	S3Dvec3f		VecRight;	S3Dvec4f		Pos;	S3Dint		ViewPort[4];	glGetIntegerv(GL_VIEWPORT, ViewPort);	Pos[3]=1.0f;	//flip y	yin=ViewPort[3]-yin;	//orientate point relative to the center of the viewport	xin=xin-(ViewPort[2]*0.5f);	yin=yin-(ViewPort[3]*0.5f);	//retrieve camera information	GetPosVector3f(Pos);	GetRightVector3f(VecRight);	GetUpVector3f(VecUp);	GetForwardVector3f(VecForward);	//set up vectors that will eventually be added to Pos	s3dVecMultiplyScalar3f(VecRight, xin);	s3dVecMultiplyScalar3f(VecUp, yin);	s3dVecMultiplyScalar3f(VecForward, zin);	//orientate Pos	s3dVecAdd3f(Pos, VecRight);	s3dVecAdd3f(Pos, VecUp);	s3dVecAdd3f(Pos, VecForward);	/*		I probably need to add the near plane distance to Pos too...I dunno yet	*/	glGetFloatv(GL_PROJECTION_MATRIX, ProjectionInversMat);	/*		I NEED TO INVERT THE PROJECTION MATRIX HERE.	*/	//invert the camera matrix	s3dMatCopy16f(CameraInverseMat, CameraMatrix);	s3dMatInvert16f(CameraInverseMat);	//move the Pos into camera space	s3dMatMultiply4x16f(Pos, CameraInverseMat);	//do a reverse projection	s3dMatMultiply4x16f(Pos, ProjectionInversMat);	//move the Pos back into world space	s3dMatMultiply4x16f(Pos, CameraMatrix);		*xout=Pos[0];	*yout=Pos[1];	*zout=Pos[2];}      


Entering 0.0f in zin should result in a point lying right on the near plane. Entering the far plane distance into zin should result in a point perpendicular to the view while also lying directly on the far plane. xin and yin are the x and y position of the mouse cursor in window coordinates.

[edited by - WhatEver on January 19, 2003 9:29:17 PM]

This topic is closed to new replies.

Advertisement