private void UserControl1_MouseMove(object sender, MouseEventArgs e) { if (is_mid_mouse_on) { int sub_x = mouse_old_x - e.X; int sub_y = mouse_old_y - e.Y; double angle_x = Math.PI * sub_x / 180.0; double angle_y = Math.PI * sub_y / 180.0; if (Math.Abs(sub_x) < 1 && Math.Abs(sub_y) < 1) { return; } camera.eyeRotateAxis(new Vector3d(0, 0, 0), angle_x, camera.getUp()); camera.eyeRotateAxis(new Vector3d(0, 0, 0), angle_y, camera.getUp().cross(camera.getEye() - camera.getCenter())); mouse_old_x = e.X; mouse_old_y = e.Y; Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); Glu.gluPerspective(45, this.Width / this.Height, 1, 1000); camera.gluLookAtLH(); Gl.glMatrixMode(Gl.GL_MODELVIEW); this.Invalidate(); } else { foreach (CLoadedObject obj in model_manager.getModelList()) { obj.state.onMouseLeave(obj, e); } Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPushMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPushMatrix(); int[] viewport = new int[4]; Gl.glViewport(0, 0, this.Width, this.Height); Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); TransformMatrixes trans = new TransformMatrixes(); SelectionData selected = Selection.GetNearest(Selection.Pick <CLoadedObject>(model_manager.getSelectionDict(), new double[] { e.X, this.Height - e.Y - 1 }, new double[] { 1, 1 }, camera, viewport, false, out trans)); if (selected != null) { (selected.item as CLoadedObject).state.onMouseOver(selected.item, e); // (selected.item as CLoadedObject).changeState(new Jusin.ObjectModel.State.ModelStateSelected()); } Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPopMatrix(); } }
override public void MouseClick(ModelManager model_manager, CCamera camera, Control control, MouseEventArgs e) { this.target_camera = camera; if (e.Button == MouseButtons.Middle) { is_mid_mouse_on = true; mouse_old_x = e.X; mouse_old_y = e.Y; } else if (e.Button == MouseButtons.Left) { model_manager.ClearSelectModel(); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPushMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPushMatrix(); int[] viewport = new int[4]; Gl.glViewport(0, 0, control.Width, control.Height); Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); TransformMatrixes trans = new TransformMatrixes(); List <SelectionData> picks; try { picks = Selection.Pick <CLoadedObject>(model_manager.getSelectionDict(), new double[] { e.X, control.Height - e.Y - 1 }, new double[] { 1, 1 }, camera, viewport, false, out trans); } catch (Exception except) { return; } SelectionData selected = Selection.GetNearest(picks); if (selected != null) { model_manager.SelectModel(selected.names[0]); // (selected.item as CLoadedObject).changeState(new Jusin.ObjectModel.State.ModelStateSelected()); ControlModeChanger.getInstance().changeMode(new NormalModeSelectedModel()); } else { ControlModeChanger.getInstance().changeMode(new NormalMode()); } Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPopMatrix(); control.Invalidate(); } }
public override void OnMouseDown(MouseEventArgs e) { if (e.Button != MouseButtons.None) { lastPos = e.Location; } if ((e.Button == MouseButtons.Left) || (e.Button == MouseButtons.Right)) { int winX = e.X, winY = this.RenderingControl.ClientSize.Height - 1 - e.Y; double depth = 0; List<SelectionData> hitObjects = Selection.Pick<Model>(this.models, this.renderingParams, new double[] { winX, winY }, new double[] { 0.1, 0.1 }, this.cam, glp.CurrentViewport, this.pickChild, out this.pickedTransformMatrixes); this.pickedModel = (Model)Selection.GetNearest(hitObjects, out depth); this.pickedWindowPosition = new double[] { winX, winY, (float)depth }; if (this.pickedModel != null) { //マウスポインタがつかんだオブジェクト表面のローカル座標を計算する。 //行列計算はOpenGLとGLUにやらせる。 MatrixMode currentMatrixMode = glp.CurrentMatrixMode; gl.MatrixMode(MatrixMode.Modelview); gl.PushMatrix(); //Pick<T>( ... )で返されるTransformMatrixSet.ModelViewプロパティには、ビューイング変換行列が格納されている。 gl.LoadMatrix(this.pickedTransformMatrixes.Modelview); this.pickedModel.ApplyParentPosition(); this.pickedModel.ApplyPosition(); double[] modelviewMatrix = glp.CurrentModelviewMatrixDouble; gl.PopMatrix(); gl.MatrixMode(currentMatrixMode); this.pickedObjectCoord = new double[3]; glu.UnProject(winX, winY, depth, ref modelviewMatrix[0], ref this.pickedTransformMatrixes.Projection[0], ref this.pickedTransformMatrixes.Viewport[0], ref this.pickedObjectCoord[0], ref this.pickedObjectCoord[1], ref this.pickedObjectCoord[2]); } else { this.pickedTransformMatrixes = null; } this.RenderingControl.Refresh(); } }
private void UserControl1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Middle) { is_mid_mouse_on = true; mouse_old_x = e.X; mouse_old_y = e.Y; } else if (e.Button == MouseButtons.Left) { this.model_manager.ClearSelectModel(); /*Gl.glEnable(Gl.GL_DEPTH_TEST); * double[] modelview = new double[16]; * Gl.glGetDoublev(Gl.GL_MODELVIEW_MATRIX,modelview); * double[] projection = new double[16]; * Gl.glGetDoublev(Gl.GL_PROJECTION_MATRIX, projection); * int[] viewport = new int[4]; * Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); * double z = 0.0 ; * double objX; * double objY; * double objZ; * Gl.glReadPixels(e.X, this.Height - e.Y, 1, 1, Gl.GL_DEPTH_COMPONENT, Gl.GL_FLOAT, z); * Glu.gluUnProject(e.X, this.Height - e.Y, (double)z, modelview, projection, viewport, out objX, out objY, out objZ); * Gl.glDisable(Gl.GL_DEPTH_TEST); * if (this.loaded.checkColl(new Vector3d(objX-camera.getEye().x, objY-camera.getEye().y, objZ-camera.getEye().z))) * { * System.Console.Write("あいうえお"); * }*/ //セレクションバッファを作成。 /* * int selectionBufferLength = 100; * uint[] selectionBuff = new uint[selectionBufferLength]; * //OpenGLに渡す。 * Gl.glSelectBuffer(selectionBuff.Length, selectionBuff); * Gl.glRenderMode(Gl.GL_SELECT); * * Gl.glPushName(-1); * // Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light); * * //マウスポインタの座標(単位:pixel) * //(注:ビューポートなどと同様に、描画領域の左下が原点) * double mouseX, mouseY; * mouseX = e.X; * mouseY = this.Height - e.Y - 1; * //マウスポインタを中心として、ヒットする範囲の幅と高さ(単位:pixel) * double width = 1.0; * double height=1.0; * //ビューポートも指定する必要があります。 * int[] viewport = new int[4]; * * Gl.glMatrixMode(Gl.GL_PROJECTION); * Gl.glPushMatrix(); * Gl.glLoadIdentity(); * Gl.glViewport(0, 0, this.Width, this.Height); * Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); * Glu.gluPickMatrix(mouseX, mouseY, width, height, viewport); * Glu.gluPerspective(45, (double)(this.Width-0 ) / (double)(this.Height - 0), 1.0, 1000.0); * * // Gl.glMatrixMode(Gl.GL_MODELVIEW); * camera.gluLookAtLH(); * Gl.glMatrixMode(Gl.GL_PROJECTION); * * // this.setViewportAndCamera(0, 0, this.Width, this.Height); * * * //camera.gluLookAtLH(); * //camera.gluLookAtLH(); * * Gl.glInitNames(); * * //draw floor * Gl.glEnable(Gl.GL_DEPTH_TEST); * Gl.glPushName(1); * /* for (int ii = 50; ii > -50; ii -= 5) * { * Gl.glBegin(Gl.GL_TRIANGLE_STRIP); * Gl.glNormal3f(0.0f, 1.0f, 0.0f); * * for (int jj = -50; jj < 50; jj += 5) * { * Gl.glColor3f(0.4f, 0.6f, 0.8f); * Gl.glVertex3f(jj, -10, ii); * Gl.glVertex3f(jj, -10, ii + 5); * } * * Gl.glEnd(); * }*/ //model.sortEntities(camera); //Gl.glEnable(Gl.GL_BLEND); //Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA); //Gl.glDepthMask(Gl.GL_FALSE); // Gl.glLoadIdentity(); /* * //Glu.gluSphere(new Glu.GLUquadric(), 1.0, 1, 1); * Gl.glPopName(); * Gl.glPushName(2); * loaded.Render(); * Gl.glMatrixMode(Gl.GL_PROJECTION); * Gl.glPopName(); * * * Gl.glDisable(Gl.GL_BLEND); * Gl.glDisable(Gl.GL_DEPTH_TEST); * //Draw XYZ axis * // this.setViewportAndCamera(this.ClientSize.Width - 50, 0, 50, 50); * //Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); * * //Glu.gluPickMatrix(mouseX, mouseY, width, height, viewport); * // Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); * //Gl.glDisable(Gl.GL_BLEND); * //Gl.glDisable(Gl.GL_POLYGON_SMOOTH); * //Gl.glLoadIdentity(); * Gl.glEnable(Gl.GL_DEPTH_TEST); * //draw floor * * // model.sortEntities(camera); * // Gl.glEnable(Gl.GL_BLEND); * //Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA); * //Gl.glDepthMask(Gl.GL_FALSE); * Gl.glMatrixMode(Gl.GL_PROJECTION); * Gl.glPopMatrix(); * Gl.glDisable(Gl.GL_DEPTH_TEST); * Gl.glFlush(); * int hits = Gl.glRenderMode(Gl.GL_RENDER); */ Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPushMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPushMatrix(); int[] viewport = new int[4]; Gl.glViewport(0, 0, this.Width, this.Height); Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); TransformMatrixes trans = new TransformMatrixes(); SelectionData selected = Selection.GetNearest(Selection.Pick <CLoadedObject>(model_manager.getSelectionDict(), new double[] { e.X, this.Height - e.Y - 1 }, new double[] { 1, 1 }, camera, viewport, false, out trans)); if (selected != null) { model_manager.SelectModel(selected.names[0]); // (selected.item as CLoadedObject).changeState(new Jusin.ObjectModel.State.ModelStateSelected()); } Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPopMatrix(); this.Invalidate(); } }
override public void MouseMove(ModelManager model_manager, CCamera camera, Control control, MouseEventArgs e) { if (is_mid_mouse_on) { //ミドルボタンが押されているときはカメラの回転処理 //この時、モデルが選ばれていたらモデルの中心点を中心に回転 int sub_x = mouse_old_x - e.X; int sub_y = mouse_old_y - e.Y; double angle_x = Math.PI * sub_x / 180.0; double angle_y = Math.PI * sub_y / 180.0; if (Math.Abs(sub_x) < 1 && Math.Abs(sub_y) < 1) { return; } Vector3d center; if (model_manager.getModelList().Count > 0) { center = model_manager.getModelList()[0].getCenterPoint(); } else { center = new Vector3d(0, 0, 0); } camera.eyeRotateAxis(center, angle_x, camera.getUp()); Vector3d axis = camera.getUp().cross(camera.getEye() - camera.getCenter()); axis.Normalize(); camera.eyeRotateAxis(center, angle_y, axis); mouse_old_x = e.X; mouse_old_y = e.Y; Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); camera.ApplyProjection(); camera.gluLookAtLH(); Gl.glMatrixMode(Gl.GL_MODELVIEW); control.Invalidate(); } else { foreach (CLoadedObject obj in model_manager.getModelList()) { obj.state.onMouseLeave(obj, e); } Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPushMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPushMatrix(); int[] viewport = new int[4]; Gl.glViewport(0, 0, control.Width, control.Height); Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport); TransformMatrixes trans = new TransformMatrixes(); List <SelectionData> picks; try { picks = Selection.Pick <CLoadedObject>(model_manager.getSelectionDict(), new double[] { e.X, control.Height - e.Y - 1 }, new double[] { 1, 1 }, camera, viewport, false, out trans); } catch (Exception except) { return; } SelectionData selected = Selection.GetNearest(picks); if (selected != null) { (selected.item as CLoadedObject).state.onMouseOver(selected.item, e); // (selected.item as CLoadedObject).changeState(new Jusin.ObjectModel.State.ModelStateSelected()); } Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPopMatrix(); } }