Example #1
0
 /// <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);
     }
 }
Example #2
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;
            }
        }
    }
Example #3
0
 /// <summary>
 /// 控制模拟开启
 /// </summary>
 private void SofaSimulationStart()
 {
     SofaPhysicsAPI.StartSimulation();
     SofaPhysicsAPI.SetAnimate(false);
     SofaPhysicsAPI.ResetScene();
     SofaPhysicsAPI.StepVisual();
     SofaPhysicsAPI.SetAnimate(true);
 }
Example #4
0
 /// <summary>
 /// 初始化SofaMesh信息
 /// </summary>
 private void SofaMeshInfoInit()
 {
     for (int i = 0; i < SofaPhysicsAPI.GetMeshAmount(); i++)
     {
         SofaMeshInfo sofaMeshInfo = new SofaMeshInfo(i);
         sofaMeshInfoDic.Add(sofaMeshInfo.componentName, sofaMeshInfo);
     }
 }
Example #5
0
 /// <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);
 }
Example #6
0
 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);
 }
Example #7
0
 private void Awake()
 {
     //注册DebugInUnity回调函数
     SofaPhysicsAPI.RegisterDebugCallBack();
     //注册Unity信息类、Sofa信息类字典
     VisualInfoDictionaryInit();
     //Sofa模拟初始化
     SofaSimulationInit();
     //遍历root下的所有节点和组件,并初始化Unity信息类
     SofaErgodicNodes();
 }
Example #8
0
 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));
 }
Example #9
0
    /// <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;
    }
Example #10
0
 /// <summary>
 /// 更改鼠标MehcanicalObject信息
 /// </summary>
 private unsafe void MouseMechanicalObjectInfoChange()
 {
     SofaPhysicsAPI.ChangeMechanicalObjectPosition(SofaPhysics.ToChar(mechanicalObjectName), 0, draggingMousePosition.x, draggingMousePosition.y, draggingMousePosition.z);
 }
Example #11
0
 private unsafe void remove1()
 {
     Debug.Log(index);
     SofaPhysicsAPI.RemoveTetrahedra(SofaPhysics.ToChar("TetraModifier"), index);
 }
Example #12
0
 /// <summary>
 /// 停止时对sofa模拟进行cleanup
 /// </summary>
 private void OnDisable()
 {
     //isSofaWorking = false;
     SofaPhysicsAPI.CleanUp();
 }
Example #13
0
 /// <summary>
 /// 停止时对sofa模拟进行cleanup
 /// </summary>
 private void OnDestroy()
 {
     //isSofaWorking = false;
     SofaPhysicsAPI.CleanUp();
 }
Example #14
0
 /// <summary>
 /// 重新加载场景
 /// </summary>
 private void SofaSimulationResetScene()
 {
     SofaPhysicsAPI.ResetScene();
 }
Example #15
0
 /// <summary>
 /// 在API端更新Mesh信息
 /// </summary>
 private void SofaSimulationStepVisual()
 {
     SofaPhysicsAPI.StepVisual();
 }
Example #16
0
 /// <summary>
 /// 停止时对sofa模拟进行cleanup
 /// </summary>
 private void OnApplicationQuit()
 {
     SofaPhysicsAPI.CleanUp();
 }
Example #17
0
    /// <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;
            }
        }
    }