PDA

View Full Version : sos



Orient
07-17-2002, 07:01 PM
I have some trouble in OpenGL these days .
I hope that you can help me ,thank you sincerely!
My question: Now I draw a object by the function -glBegin(GL_QUADS); And after some process by light , the object was appeared in the screen. But I want to select a polygon by the mouse in the screen , I don't know how to get original coordinate of the whole polygon area ,is there any function in
OpengGL, if there isn't ,and How to finish it?
thank you

BlackJack
07-17-2002, 09:08 PM
Orient, you gotta do it the other way round. You've to calculate the direction vector into which your mouse points http://www.opengl.org/discussion_boards/ubb/wink.gif. When you have got this vector you can also do many prechecks then with DistanceLinePoint, if you give your models' boundingboxes a center and radius value, so that you at the end only still have some less polygons remaining which you need to test with RayTriIntersect.

Unfortunately can't paste any code here... although, wait...... ok, here some old Delphi code, shouldn't be a big deal for you to translate it to C++:





Procedure CalcMouseVec;
Var PX,PY,PZ,ZX,ZY,ZZ : Single;
CosG,CosN,SinG,
SinN : Single;
gangle,nangle : single;
VPMidX,VPMidY : Single;

Begin
gangle:=-OglW.DriverV.observerv.Gier/180*pi;
nangle:=-OglW.DriverV.observerv.Nick/180*pi;

CosG:=cos(gangle);SinG:=sin(gangle);
CosN:=cos(nangle);SinN:=sin(nangle);

VPMidX:=OglW.DriverV.display_rect.width/2;
VPMidY:=OglW.DriverV.display_rect.Height/2;
//Calculate unrotated mousevector
PX:=OglW.DriverV.perspectivev.FrLeft/VPMidX*-(actmx-VPMidX);
PY:=OglW.DriverV.perspectivev.FrTop/VPMidY*-(actmy-VPMidY);
PZ:=-OglW.DriverV.perspectivev.Near_Clipping;
//rotate by nick angle
zx:=px;
zz:=CosN*pz+SinN*py;
zy:=-SinN*pz+CosN*py;
//rotate by gier angle
MouseVec.x:=CosG*zx+SinG*zz;
MouseVec.y:=zy;
MouseVec.z:=-SinG*zx+CosG*zz;
End;


Ok, for this you need to have following values:
-your frustum edges
-your mouse x and mouse y http://www.opengl.org/discussion_boards/ubb/wink.gif
-your actual nick and gier
Result:
MouseVec (Vector pointing from your eye position to where your mouse points at)

If you don't know how to calculate your frustum... so still use gluPerspective instead, please replace it through following as the frustum values will later be needed to calculate your mouse vector:





mfFrTop = mfClipNear*(float)tan((mfAugYAngle/2.f)*(pi/180.f));
mfFrRight = mfFrTop*(mfAugXAngle/mfAugYAngle);
mfFrBottom = -mfFrTop;
mfFrLeft = -mfFrRight;
glFrustum(mfFrLeft,mfFrRight,mfFrBottom,mfFrTop,mf ClipNear,mfClipFar);


Hope this helps,

BlackJack

[This message has been edited by BlackJack (edited 07-17-2002).]