UnityのHandlesクラスの拡張
Unityで幾何学のアルゴリズムを実装するときに、イメージがしやすいようにHanldesクラスを拡張してデバッグ描画できるようにしました。
以下のようなコードを書くと追加されたDrawerの順に描画されていきます。
var drawer = new Drawer(); var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); var mesh = cube.GetComponent<MeshFilter>().sharedMesh; for (int i = 0; i < mesh.triangles.Length;) { var a = mesh.vertices[mesh.triangles[i++]]; var b = mesh.vertices[mesh.triangles[i++]]; var c = mesh.vertices[mesh.triangles[i++]]; var triangleProp = new TriangleDrawProperty() { VertexA = a, VertexB = b, VertexC = c, VertexAColor = Color.cyan, VertexBColor = Color.cyan, VertexCColor = Color.cyan, EdgeABColor = Color.green, EdgeBCColor = Color.green, EdgeCAColor = Color.green, }; var triangleDrawer = new TriangleDrawer(triangleProp); drawer.Drawers.Add(triangleDrawer); } DrawerManager.Instance.AddDrawer("cube", drawer); GameObject.DestroyImmediate(cube);
特定の箇所だけ一気に描画できるようにしました。
triangleDrawer.BatchDraw = true;
とるすと一個の三角形を一気に描画します。
drawer.BatchDraw = true;
とするとすべての三角形を一気に描画します。
動画の円を描いている部分は以下のコードです。
var circlesDrawer = new Drawer(); for (int i = 0; i <= 36; i++) { var circleDrawerProp = new CircleDrawProperty(); circleDrawerProp.Center = UnityEngine.Vector3.zero; circleDrawerProp.Angle = 10 * i; circleDrawerProp.Color = Color.yellow; var d = i / 70f; circleDrawerProp.From = new Vector3(0.1f + d, 0.1f + d, 0.1f + d); circleDrawerProp.Radius = Vector3.Distance(circleDrawerProp.Center, circleDrawerProp.From); var vec1 = circleDrawerProp.From - circleDrawerProp.Center; var vec2 = new Vector3(-0.1f - d, -0.1f - d, 0.0f) - circleDrawerProp.Center; var normal = Vector3.Cross(vec1, vec2).normalized; circleDrawerProp.Normal = normal; var circleDrawer = new CircleDrawer(circleDrawerProp); circlesDrawer.Drawers.Add(circleDrawer); } DrawerManager.Instance.AddDrawer("circle", circlesDrawer);
もうすこし機能を追加して公開したいと思います。