- type point3d = record
- x,y,z:TGLFloat;
- end;
- procedure TMainform.FormMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- var modelmatrix,projmatrix: TMatrix4d;
- Viewport: TVector4i;
- v,v1,v2,org: Point3d;
- ox,oy,oz: TGLFloat;
- f: TGLFloat;
- disp:string;
- begin
- glGetDoubleV(GL_MODELVIEW_MATRIX, Addr(modelmatrix));
- glGetDoubleV(GL_PROJECTION_MATRIX, Addr(projmatrix));
- glGetIntegerV(GL_VIEWPORT, Addr(viewport));
- gluUnProject(x,Viewport[3]-y,0, modelmatrix, projmatrix, viewport, @ox, @oy, @oz);
- v1.x := ox; v1.y := oy; v1.z := oz;
- // v1 enthält Position an z=0
- gluUnProject(x,Viewport[3]-y,0.1, modelmatrix, projmatrix, viewport, @ox, @oy, @oz);
- v2.x := ox; v2.y := oy; v2.z := oz;
- // v2 enthält Position an z>0
- v.x := v2.x - v1.x;
- v.y := v2.y - v1.y;
- v.z := v2.z - v1.z;
- // v ist Richtungsvektor in z-Richtung
- if (abs(v.y)>0.001) and (v.y*v1.y<0) then begin
- // die Maus ist über dem Boden
- f := v1.y / v.y;
- v2.x := v1.x - f*v.x;
- v2.y := v1.y - f*v.y;
- v2.z := v1.z - f*v.z;
- // v2 enthält auf Boden projizierten Strahl - die Projektion ist sehr einfach, da die Bodenplatte keine Rotation enthält und auf der Höhe 0 liegt.
- if abs(v2.x)<0.001 then v2.x := 0;
- if abs(v2.y)<0.001 then v2.y := 0;
- if abs(v2.z)<0.001 then v2.z := 0;
- disp := FloatToStrF(round(v2.x), ffGeneral, 3, 3) + ' ' +
- FloatToStrF(round(v2.y), ffGeneral, 3, 3) + ' ' +
- FloatToStrF(round(v2.z), ffGeneral, 3, 3);
- Org := v2;
- // vergiss die oberen Zeilen, die benötige ich in Mcad nur, um den Nullpunkt exakt anwählen zu können und eine Ausgabe zu tätigen
- end
- else begin
- // hier machst du halt etwas, wenn die Maus gar nicht über dem Boden ist
- // VectorSet(Org, 0, 0, 0);
- // ViewDirectionZ(-NewObjDist, Org);
- // Org := VectorAdd(Org, Vector(-vxp, -vyp, -vzp));
- end;
- showmessage(disp);
- end;