/// <summary> /// 动态添加鼠标的MehcanicalObject组件至root节点,生成其信息。添加StiffSpringForceField组件,连接目标物体和鼠标MechanicalObject /// </summary> private unsafe void MouseDragAdd() { if (!SofaPhysics.unityMechanicalObjectInfoDic.ContainsKey(mechanicalObjectName) && !SofaPhysics.sofaMechanicalObjectInfoDic.ContainsKey(mechanicalObjectName)) { //加入mechanicalObject组件及相关info double[] dou = new double[3] { draggingMousePosition.x, draggingMousePosition.y, draggingMousePosition.z }; SofaPhysicsAPI.AddMechanicalObjectArray(SofaPhysics.ToChar("root"), SofaPhysics.ToChar(mechanicalObjectName), dou, 1); for (int i = 0; i < SofaPhysics.nodes.Length; i++) { if (SofaPhysics.nodes[i].gameObject.name == "root") { UnityMechanicalObjectInfo unityMechanicalObjectInfo = new UnityMechanicalObjectInfo(SofaPhysics.nodes[i], mechanicalObjectName); SofaPhysics.unityMechanicalObjectInfoDic.Add(unityMechanicalObjectInfo.componentName, unityMechanicalObjectInfo); } } foreach (string componentName in SofaPhysics.unityMechanicalObjectInfoDic.Keys) { if (mechanicalObjectName == componentName) { SofaMechanicalObjectInfo sofaMechanicalObjectInfo = new SofaMechanicalObjectInfo(componentName); SofaPhysics.sofaMechanicalObjectInfoDic.Add(sofaMechanicalObjectInfo.componentName, sofaMechanicalObjectInfo); } } //加入stiffSpringForceField组件及其Spring SofaPhysicsAPI.AddStiffSpringForceField(SofaPhysics.ToChar("root"), SofaPhysics.ToChar(stiffSpringForceFieldName), SofaPhysics.ToChar("@./"), SofaPhysics.ToChar(GetSrcPathToRoot()), dragSpringKs, 0.1, 1); SofaPhysicsAPI.SpringAddToStiffSpringForceField(SofaPhysics.ToChar(stiffSpringForceFieldName), 0, draggingMechanicalObjectPointIndex, dragSpringKs, dragSpringKd, 0); } }
private unsafe void remove() { Debug.Log(index); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out raycastHit)) { switch (raycastHit.transform.gameObject.name) { case "TriangleTopologyVisual": break; case "QuadTopologyVisual": break; case "TetrahedraTopologyVisual": Debug.Log("triangle index:" + raycastHit.triangleIndex); int tetrahedraIndex = Mathf.FloorToInt(raycastHit.triangleIndex / 4); Debug.Log("remove:" + tetrahedraIndex); SofaPhysicsAPI.RemoveTetrahedra(SofaPhysics.ToChar("TetraModifier"), tetrahedraIndex); break; default: break; } } }
/// <summary> /// 控制模拟开启 /// </summary> private void SofaSimulationStart() { SofaPhysicsAPI.StartSimulation(); SofaPhysicsAPI.SetAnimate(false); SofaPhysicsAPI.ResetScene(); SofaPhysicsAPI.StepVisual(); SofaPhysicsAPI.SetAnimate(true); }
/// <summary> /// 初始化SofaMesh信息 /// </summary> private void SofaMeshInfoInit() { for (int i = 0; i < SofaPhysicsAPI.GetMeshAmount(); i++) { SofaMeshInfo sofaMeshInfo = new SofaMeshInfo(i); sofaMeshInfoDic.Add(sofaMeshInfo.componentName, sofaMeshInfo); } }
/// <summary> /// 清除鼠标MechanicalObject、StiffSpringForceField组件及其字典中储存的信息,将临时变量归零 /// </summary> private unsafe void MouseDragRemove() { //移除StiffSpringForceFiled组件 SofaPhysicsAPI.RemoveStiffSpringForceField(SofaPhysics.ToChar("root"), SofaPhysics.ToChar(stiffSpringForceFieldName)); //移除MechanicalObject组件及字典中储存的信息 SofaPhysicsAPI.RemoveMechanicalObject(SofaPhysics.ToChar("root"), SofaPhysics.ToChar(mechanicalObjectName)); SofaPhysics.unityMechanicalObjectInfoDic.Remove(mechanicalObjectName); SofaPhysics.sofaMechanicalObjectInfoDic.Remove(mechanicalObjectName); }
public void Update() { componentName = SofaPhysics.ToStr(SofaPhysicsAPI.GetMeshName(meshIndex)); verticesAmount = SofaPhysicsAPI.GetMeshVerticesAmount(meshIndex); verticesPosition = SofaPhysicsAPI.GetMeshVerticesPositions(meshIndex); triangleAmount = SofaPhysicsAPI.GetMeshTriangleAmount(meshIndex); triangleTopology = SofaPhysicsAPI.GetMeshTriangleTopology(meshIndex); quadAmount = SofaPhysicsAPI.GetMeshQuadAmount(meshIndex); quadTopology = SofaPhysicsAPI.GetMeshQuadTopology(meshIndex); }
private void Awake() { //注册DebugInUnity回调函数 SofaPhysicsAPI.RegisterDebugCallBack(); //注册Unity信息类、Sofa信息类字典 VisualInfoDictionaryInit(); //Sofa模拟初始化 SofaSimulationInit(); //遍历root下的所有节点和组件,并初始化Unity信息类 SofaErgodicNodes(); }
public void Update() { verticesAmount = SofaPhysicsAPI.GetMechanicalObjectVerticesAmount(SofaPhysics.ToChar(componentName)); verticesPosition = SofaPhysicsAPI.GetMechanicalObjectVerticesPositions(SofaPhysics.ToChar(componentName)); triangleAmount = SofaPhysicsAPI.GetMechanicalObjectTriangleAmount(SofaPhysics.ToChar(componentName)); triangleTopology = SofaPhysicsAPI.GetMechanicalObjectTriangleTopology(SofaPhysics.ToChar(componentName)); quadAmount = SofaPhysicsAPI.GetMechanicalObjectQuadAmount(SofaPhysics.ToChar(componentName)); quadTopology = SofaPhysicsAPI.GetMechanicalObjectQuadTopology(SofaPhysics.ToChar(componentName)); tetrahedraAmount = SofaPhysicsAPI.GetMechanicalObjectTetrahedraAmount(SofaPhysics.ToChar(componentName)); tetrahedraTopology = SofaPhysicsAPI.GetMechanicalObjectTetrahedraTopology(SofaPhysics.ToChar(componentName)); }
/// <summary> /// Sofa模拟初始化,包括开启模拟、创建根节点、添加节点、组件、控制模拟进行等 /// </summary> private unsafe void SofaSimulationInit() { //初始化Sofa、开启模拟、创建根节点 SofaPhysicsAPI.HelloSofa(); SofaPhysicsAPI.Instance(); SofaPhysicsAPI.InitSimulation(); SofaPhysicsAPI.CreateRoot(ToChar("root")); //初始化鼠标拖拽功能(需要在Sofa模拟开启后进行),第二次初始化时unity崩溃,需要修改CleanUp方法,释放所有动态生成的节点和组件 //SofaPhysicsAPI.MouseDragInitial(); //isMouseDragInitialed = true; }
/// <summary> /// 更改鼠标MehcanicalObject信息 /// </summary> private unsafe void MouseMechanicalObjectInfoChange() { SofaPhysicsAPI.ChangeMechanicalObjectPosition(SofaPhysics.ToChar(mechanicalObjectName), 0, draggingMousePosition.x, draggingMousePosition.y, draggingMousePosition.z); }
private unsafe void remove1() { Debug.Log(index); SofaPhysicsAPI.RemoveTetrahedra(SofaPhysics.ToChar("TetraModifier"), index); }
/// <summary> /// 停止时对sofa模拟进行cleanup /// </summary> private void OnDisable() { //isSofaWorking = false; SofaPhysicsAPI.CleanUp(); }
/// <summary> /// 停止时对sofa模拟进行cleanup /// </summary> private void OnDestroy() { //isSofaWorking = false; SofaPhysicsAPI.CleanUp(); }
/// <summary> /// 重新加载场景 /// </summary> private void SofaSimulationResetScene() { SofaPhysicsAPI.ResetScene(); }
/// <summary> /// 在API端更新Mesh信息 /// </summary> private void SofaSimulationStepVisual() { SofaPhysicsAPI.StepVisual(); }
/// <summary> /// 停止时对sofa模拟进行cleanup /// </summary> private void OnApplicationQuit() { SofaPhysicsAPI.CleanUp(); }
/// <summary> /// 根据每个节点的组件信息调用SofaPhysicsAPI,对于mechanicalObject和olgModel组件,动态创建unity相关渲染组件 /// </summary> /// <param name="node"></param> private void SofaErgodicComponents(Transform node) { if (node.name != "root") { SofaPhysicsAPI.AddChildNode(ToChar(node.parent.name), ToChar(node.name)); } Component[] allComponents; allComponents = node.gameObject.GetComponents <Component>(); foreach (Component com in allComponents) { switch (com.GetType().Name) { case "Sofa_DefaultPipeline": Sofa_DefaultPipeline defaultPipeline = node.gameObject.GetComponent <Sofa_DefaultPipeline>(); SofaPhysicsAPI.AddDefaultPipeline(ToChar(node.name), ToChar(defaultPipeline.componentName)); break; case "Sofa_BruteForceDetection": Sofa_BruteForceDetection bruteForceDetection = node.gameObject.GetComponent <Sofa_BruteForceDetection>(); SofaPhysicsAPI.AddBruteForceDetection(ToChar(node.name), ToChar(bruteForceDetection.componentName)); break; case "Sofa_DefaultContactManager": Sofa_DefaultContactManager defaultContactManager = node.gameObject.GetComponent <Sofa_DefaultContactManager>(); SofaPhysicsAPI.AddDefaultContactManager(ToChar(node.name), ToChar(defaultContactManager.componentName)); break; case "Sofa_DiscreteIntersection": Sofa_DiscreteIntersection discreteIntersection = node.gameObject.GetComponent <Sofa_DiscreteIntersection>(); SofaPhysicsAPI.AddDiscreteIntersection(ToChar(node.name), ToChar(discreteIntersection.componentName)); break; case "Sofa_EulerImplicSolver": Sofa_EulerImplicSolver eulerImplicSolver = node.gameObject.GetComponent <Sofa_EulerImplicSolver>(); SofaPhysicsAPI.AddEulerImplicSolver(ToChar(node.name), ToChar(eulerImplicSolver.componentName), eulerImplicSolver.rayleighStiffness, eulerImplicSolver.rayleighMass); break; case "Sofa_CGLinearSolver": Sofa_CGLinearSolver cGLinearSolver = node.gameObject.GetComponent <Sofa_CGLinearSolver>(); SofaPhysicsAPI.AddCGLinearSolver(ToChar(node.name), ToChar(cGLinearSolver.componentName), cGLinearSolver.iterations, cGLinearSolver.tolerance, cGLinearSolver.threshold); break; case "Sofa_MeshGmshLoader": Sofa_MeshGmshLoader meshGmshLoader = node.gameObject.GetComponent <Sofa_MeshGmshLoader>(); SofaPhysicsAPI.AddMeshGmshLoader(ToChar(node.name), ToChar(meshGmshLoader.componentName), ToChar(meshGmshLoader.filePath)); break; case "Sofa_TetrahedronSetTopologyContainer": Sofa_TetrahedronSetTopologyContainer tetrahedronSetTopologyContainer = node.gameObject.GetComponent <Sofa_TetrahedronSetTopologyContainer>(); SofaPhysicsAPI.AddTetrahedronSetTopologyContainer(ToChar(node.name), ToChar(tetrahedronSetTopologyContainer.componentName), ToChar(tetrahedronSetTopologyContainer.srcPath), ToChar(tetrahedronSetTopologyContainer.srcName)); break; case "Sofa_MechanicalObject": Sofa_MechanicalObject mechanicalObject = node.gameObject.GetComponent <Sofa_MechanicalObject>(); SofaPhysicsAPI.AddMechanicalObjectSrcPath(ToChar(node.name), ToChar(mechanicalObject.componentName), ToChar(mechanicalObject.srcPath), ToChar(mechanicalObject.srcName)); UnityMechanicalObjectInfoInit(node, mechanicalObject.componentName, mechanicalObject.triangleMat, mechanicalObject.quadMat, mechanicalObject.tetrahedraMat); break; case "Sofa_TetrahedronSetGeometryAlgorithms": Sofa_TetrahedronSetGeometryAlgorithms tetrahedronSetGeometryAlgorithms = node.gameObject.GetComponent <Sofa_TetrahedronSetGeometryAlgorithms>(); SofaPhysicsAPI.AddTetrahedronSetGeometryAlgorithms(ToChar(node.name), ToChar(tetrahedronSetGeometryAlgorithms.componentName)); break; case "Sofa_TetrahedronSetTopologyModifier": Sofa_TetrahedronSetTopologyModifier tetrahedronSetTopologyModifier = node.gameObject.GetComponent <Sofa_TetrahedronSetTopologyModifier>(); SofaPhysicsAPI.AddTetrahedronSetTopologyModifier(ToChar(node.name), ToChar(tetrahedronSetTopologyModifier.componentName)); break; case "Sofa_TetrahedronSetTopologyAlgorithms": Sofa_TetrahedronSetTopologyAlgorithms tetrahedronSetTopologyAlgorithms = node.gameObject.GetComponent <Sofa_TetrahedronSetTopologyAlgorithms>(); SofaPhysicsAPI.AddTetrahedronSetTopologyAlgorithms(ToChar(node.name), ToChar(tetrahedronSetTopologyAlgorithms.componentName)); break; case "Sofa_DiagonalMass": Sofa_DiagonalMass diagonalMass = node.gameObject.GetComponent <Sofa_DiagonalMass>(); SofaPhysicsAPI.AddDiagonalMass(ToChar(node.name), ToChar(diagonalMass.componentName), diagonalMass.massDensity); break; case "Sofa_TetrahedralCorotationalFEMForceField": Sofa_TetrahedralCorotationalFEMForceField tetrahedralCorotationalFEMForceField = node.gameObject.GetComponent <Sofa_TetrahedralCorotationalFEMForceField>(); SofaPhysicsAPI.AddTetrahedralCorotationalFEMForceField(ToChar(node.name), ToChar(tetrahedralCorotationalFEMForceField.componentName), ToChar(tetrahedralCorotationalFEMForceField.method), tetrahedralCorotationalFEMForceField.poissonRatio, tetrahedralCorotationalFEMForceField.youngModulus, tetrahedralCorotationalFEMForceField.computeGlobalMatrix); break; case "Sofa_FixedConstraint": Sofa_FixedConstraint fixedConstraint = node.gameObject.GetComponent <Sofa_FixedConstraint>(); SofaPhysicsAPI.AddFixedConstraint(ToChar(node.name), ToChar(fixedConstraint.componentName), fixedConstraint.indices, fixedConstraint.indices.Length); break; case "Sofa_OglModel": Sofa_OglModel oglModel = node.gameObject.GetComponent <Sofa_OglModel>(); SofaPhysicsAPI.AddOglModel(ToChar(node.name), ToChar(oglModel.componentName), ToChar(oglModel.fileMesh)); UnityMeshInfoInit(node, oglModel.componentName, oglModel.mat); break; case "Sofa_BarycentricMapping": Sofa_BarycentricMapping baryCentricMapping = node.gameObject.GetComponent <Sofa_BarycentricMapping>(); SofaPhysicsAPI.AddBarycentricMapping(ToChar(node.name), ToChar(baryCentricMapping.componentName), ToChar(baryCentricMapping.input), ToChar(baryCentricMapping.output)); break; default: break; } } }