Skip to content

Commit 898a48a

Browse files
AIRO-274 Convex decomposition for collision meshes using VHACD (#2)
* 1. Adding VHACD submodule 2. Updating mesh URDF mesh import scripts * Updating to new VHACD structure Co-authored-by: Devin Miller <devin.miller@unity3d.com>
1 parent f8c8a55 commit 898a48a

File tree

17 files changed

+129
-41
lines changed

17 files changed

+129
-41
lines changed

.DS_Store

10 KB
Binary file not shown.

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "VHACD"]
2+
path = Editor/VHACD
3+
url = https://github.com/Unity-Technologies/VHACD

Editor/MenuItems/FileImportMenu.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ namespace RosSharp.Urdf.Editor
88
public class FileImportMenu : EditorWindow
99
{
1010
public string urdfFile;
11-
public axisType choosenAxis = axisType.yAxis;
11+
public ImportSettings settings = new ImportSettings();
1212
private static string[] windowOptions = { };
1313

1414
private void OnGUI()
1515
{
1616
//Styles definitions
17+
1718
GUIStyle titleStyle = new GUIStyle(EditorStyles.boldLabel)
1819
{
19-
alignment = TextAnchor.MiddleCenter,
20+
alignment = TextAnchor.MiddleLeft,
2021
fontSize = 13
2122
};
23+
2224
GUIStyle buttonStyle = new GUIStyle(EditorStyles.miniButtonRight) { fixedWidth = 75 };
2325

2426
//Window title
@@ -28,17 +30,27 @@ private void OnGUI()
2830
//Select the original up axis of the imported mesh
2931
GUILayout.Space(5);
3032
EditorGUILayout.BeginHorizontal();
31-
choosenAxis = (axisType)EditorGUILayout.EnumPopup(
32-
"Select Axis Type" , choosenAxis);
33+
settings.choosenAxis = (ImportSettings.axisType)EditorGUILayout.EnumPopup(
34+
"Select Axis Type" , settings.choosenAxis);
3335
EditorGUILayout.EndHorizontal();
3436

37+
//Window title
38+
GUILayout.Space(10);
39+
GUILayout.Label("Select Convex Decomposer", titleStyle);
40+
41+
//Select the mesh decomposer
42+
GUILayout.Space(5);
43+
EditorGUILayout.BeginHorizontal();
44+
settings.convexMethod = (ImportSettings.convexDecomposer)EditorGUILayout.EnumPopup(
45+
"Mesh Decomposer", settings.convexMethod);
46+
EditorGUILayout.EndHorizontal();
3547

3648
//Import Robot button
3749
GUILayout.Space(10);
3850
if (GUILayout.Button("Import URDF"))
3951
{
4052
if (urdfFile != "")
41-
UrdfRobotExtensions.Create(urdfFile,choosenAxis);
53+
UrdfRobotExtensions.Create(urdfFile,settings);
4254
Close();
4355
}
4456

Editor/NeedsRuntimeConversion/Extensions/UrdfGeometryCollision.cs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
using UnityEngine;
44
using UnityEditor;
5+
using System.Collections.Generic;
6+
using MeshProcess;
57

68
namespace RosSharp.Urdf.Editor
79
{
@@ -94,16 +96,37 @@ public static void CreateMatchingMeshCollision(Transform parent, Transform visua
9496
private static void ConvertMeshToColliders(GameObject gameObject, bool setConvex = true)
9597
{
9698
MeshFilter[] meshFilters = gameObject.GetComponentsInChildren<MeshFilter>();
97-
foreach (MeshFilter meshFilter in meshFilters)
99+
if (UrdfRobotExtensions.importsettings.convexMethod == ImportSettings.convexDecomposer.unity)
98100
{
99-
GameObject child = meshFilter.gameObject;
100-
MeshCollider meshCollider = child.AddComponent<MeshCollider>();
101-
meshCollider.sharedMesh = meshFilter.sharedMesh;
101+
foreach (MeshFilter meshFilter in meshFilters)
102+
{
103+
GameObject child = meshFilter.gameObject;
104+
MeshCollider meshCollider = child.AddComponent<MeshCollider>();
105+
meshCollider.sharedMesh = meshFilter.sharedMesh;
102106

103-
meshCollider.convex = setConvex;
107+
meshCollider.convex = setConvex;
104108

105-
Object.DestroyImmediate(child.GetComponent<MeshRenderer>());
106-
Object.DestroyImmediate(meshFilter);
109+
Object.DestroyImmediate(child.GetComponent<MeshRenderer>());
110+
Object.DestroyImmediate(meshFilter);
111+
}
112+
}
113+
else
114+
{
115+
foreach (MeshFilter meshFilter in meshFilters)
116+
{
117+
GameObject child = meshFilter.gameObject;
118+
VHACD decomposer = child.AddComponent<VHACD>();
119+
List<Mesh> colliderMeshes = decomposer.GenerateConvexMeshes(meshFilter.sharedMesh);
120+
foreach (Mesh collider in colliderMeshes)
121+
{
122+
MeshCollider current = child.AddComponent<MeshCollider>();
123+
current.sharedMesh = collider;
124+
current.convex = setConvex;
125+
}
126+
Component.DestroyImmediate(child.GetComponent<VHACD>());
127+
Object.DestroyImmediate(child.GetComponent<MeshRenderer>());
128+
Object.DestroyImmediate(meshFilter);
129+
}
107130
}
108131
}
109132
}

Editor/NeedsRuntimeConversion/Extensions/UrdfRobotExtensions.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-

2-
3-
using System.Collections.Generic;
1+
using System.Collections.Generic;
42
using System.IO;
53
using System.Linq;
64
using UnityEditor;
@@ -12,7 +10,7 @@ namespace RosSharp.Urdf.Editor
1210
public static class UrdfRobotExtensions
1311
{
1412
static string tagName = "robot";
15-
static public Urdf.axisType robotAxis;
13+
public static ImportSettings importsettings;
1614

1715
public static void Create()
1816
{
@@ -32,9 +30,10 @@ public static void Create()
3230

3331
#region Import
3432

35-
public static void Create(string filename, Urdf.axisType meshAxis = axisType.yAxis)
33+
public static void Create(string filename, ImportSettings settings)
3634
{
3735
CreateTag();
36+
importsettings = settings;
3837
Robot robot = new Robot(filename);
3938

4039
if (!UrdfAssetPathHandler.IsValidAssetPath(robot.filename))
@@ -51,7 +50,7 @@ public static void Create(string filename, Urdf.axisType meshAxis = axisType.yAx
5150

5251
robotGameObject.AddComponent<RosSharp.Control.Controller>();
5352

54-
robotGameObject.GetComponent<UrdfRobot>().SetAxis(meshAxis);
53+
robotGameObject.GetComponent<UrdfRobot>().SetAxis(settings.choosenAxis);
5554

5655
UrdfAssetPathHandler.SetPackageRoot(Path.GetDirectoryName(robot.filename));
5756
UrdfMaterial.InitializeRobotMaterials(robot);
@@ -63,10 +62,10 @@ public static void Create(string filename, Urdf.axisType meshAxis = axisType.yAx
6362
Undo.RegisterCreatedObjectUndo(robotGameObject, "Create " + robotGameObject.name);
6463
Selection.activeObject = robotGameObject;
6564

66-
CorrectAxis(robotGameObject, meshAxis);
65+
CorrectAxis(robotGameObject, settings.choosenAxis);
6766
}
6867

69-
public static void CorrectAxis(GameObject robot, Urdf.axisType axis = axisType.yAxis)
68+
public static void CorrectAxis(GameObject robot, ImportSettings.axisType axis = ImportSettings.axisType.yAxis)
7069
{
7170
UrdfVisual[] visualMeshList = robot.GetComponentsInChildren<UrdfVisual>();
7271
UrdfCollision[] collisionMeshList = robot.GetComponentsInChildren<UrdfCollision>();
@@ -76,7 +75,7 @@ public static void CorrectAxis(GameObject robot, Urdf.axisType axis = axisType.y
7675
Quaternion correctZtoY = Quaternion.Euler(-90, 0, 90);
7776
Quaternion correction = Quaternion.identity;
7877

79-
if (axis == Urdf.axisType.zAxis)
78+
if (axis == ImportSettings.axisType.zAxis)
8079
correction = correctZtoY;
8180

8281

Editor/Unity.Robotics.URDFImporter.Editor.asmdef

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@
22
"name": "Unity.Robotics.URDFImporter.Editor",
33
"rootNamespace": "RosSharp.Urdf.Editor",
44
"references": [
5-
"GUID:b1ef917f7a8a86a4eb639ec2352edbf8"
5+
"GUID:b1ef917f7a8a86a4eb639ec2352edbf8",
6+
"GUID:6a697808d7c80a549b57420070d6c4f3"
67
],
78
"includePlatforms": [
89
"Editor"
910
],
1011
"excludePlatforms": [],
11-
"allowUnsafeCode": false,
12+
"allowUnsafeCode": true,
1213
"overrideReferences": false,
1314
"precompiledReferences": [],
14-
"autoReferenced": false,
15+
"autoReferenced": true,
1516
"defineConstraints": [],
1617
"versionDefines": [],
1718
"noEngineReferences": false

Editor/VHACD

Submodule VHACD added at ae4a252

Editor/VHACD.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/.DS_Store

8 KB
Binary file not shown.

Runtime/Controller/.DS_Store

6 KB
Binary file not shown.

0 commit comments

Comments
 (0)