diff --git a/CMCore b/CMCore index c37a3836..e73191ba 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit c37a38362c96ed52f1df30c8ad51ae3f031d2fe6 +Subproject commit e73191bad7f576012e83342ffbae2a1975bfdc7c diff --git a/CMSceneGraph b/CMSceneGraph index eacccdde..4ac29ed9 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit eacccdde053fc33b5f1aaa0f20e4752ef1fb7c7d +Subproject commit 4ac29ed91a99d869c3e41f659088ddf53e7dbaca diff --git a/example/Gizmo/Gizmo3DMove.cpp b/example/Gizmo/Gizmo3DMove.cpp index ab6b672c..4c0c98b8 100644 --- a/example/Gizmo/Gizmo3DMove.cpp +++ b/example/Gizmo/Gizmo3DMove.cpp @@ -63,6 +63,8 @@ namespace int PickAXIS=-1; //拾取轴 float PickDist=0; //拾取辆距离轴心的距离 + Matrix4f PickL2W; //拾取时的变换矩阵 + Vector3f PickCenter; //拾取时的中心位置 TransformTranslate3f *CurTranslate=nullptr; @@ -213,10 +215,19 @@ namespace if(CurAXIS>=0&&CurAXIS<3) { - PickAXIS=CurAXIS; - PickDist=CurDist; + PickAXIS =CurAXIS; + PickDist =CurDist; + PickL2W =GetLocalToWorldMatrix(); //记录拾取时的变换矩阵 + PickCenter =TransformPosition(PickL2W,Vector3f(0,0,0)); //记录拾取时的中心位置 - CurTranslate=GetTransform().AddTranslate(Vector3f(0,0,0)); + if(CurTranslate) + { + CurTranslate->SetOffset(Vector3f(0,0,0)); + } + else + { + CurTranslate=GetTransform().AddTranslate(Vector3f(0,0,0)); + } return io::EventProcResult::Break; // 处理完鼠标按下事件,停止进一步处理 } @@ -226,11 +237,56 @@ namespace io::EventProcResult OnReleased(const Vector2i &,io::MouseButton mb) override { + if(CurTranslate) + { + GetTransform().RemoveTransform(CurTranslate); + CurTranslate=nullptr; + } + + return io::EventProcResult::Continue; + } + + io::EventProcResult OnMoveAtControl(const Vector2i &mouse_coord) + { + CameraControl *cc=GetCameraControl(); + + if(!cc) + return io::EventProcResult::Continue; + + cc->SetMouseRay(&MouseRay,mouse_coord); + + const CameraInfo *ci=cc->GetCameraInfo(); + + Vector3f axis_vector=GetAxisVector(AXIS(PickAXIS)); //取得轴向量 + + Vector3f end=axis_vector*std::abs(ci->zfar-ci->znear); + + end=TransformPosition(PickL2W,end); //将轴的终点转换到世界坐标 + + Vector3f p_ray,p_ls; + + MouseRay.ClosestPoint( + p_ray, // 射线上的点 + p_ls, // 线段上的点 + PickCenter, // 线段起点 + end); // 线段终点 + + CurDist=glm::length(p_ls-PickCenter); //计算线段上的点与原点的距离 + CurTranslate->SetOffset(axis_vector*(CurDist-PickDist)); //设置偏移量 + + std::cout<<"PickDist: "<SetOffset(axis_vector*(CurDist-PickDist)); - } - } + CurDist=glm::length(p_ls-start); //计算线段上的点与原点的距离 } else { @@ -301,6 +347,9 @@ namespace //std::cout<<"Distance: "<GetViewportInfo(),default_camera,ubo_camera_info); auto ckc=new CameraKeyboardControl(fpcc); - auto cmc=new CameraMouseControl(fpcc); + //auto cmc=new CameraMouseControl(fpcc); this->AddChildDispatcher(fpcc); fpcc->AddChildDispatcher(ckc); - fpcc->AddChildDispatcher(cmc); + //fpcc->AddChildDispatcher(cmc); default_camera_control=fpcc; - mouse_event=cmc; + //mouse_event=cmc; } default_renderer->SetCameraControl(default_camera_control);