static void DrawMap(VoxelBuilder target)
    {
        var nowHeight = target.GetNowFlowerHeight();
        var original  = target.transform.position + nowHeight;

        //畫點
        var offsetX  = 0.5f * Vector3.right * VoxelBuilder.xUnit;
        var offsetY  = 0.5f * Vector3.forward * VoxelBuilder.yUnit;
        var offsetXY = offsetX + offsetY;

        var nowFloorIndex = target.GetNowFloorIndex();

        if (!target.IsValidatedFloorIndex(nowFloorIndex))
        {
            return;
        }

        var CountY = target.CountY(); var CountX = target.CountX();

        for (var y = 0; y < CountY; ++y)
        {
            var from = original + offsetXY + offsetY * y;
            for (var x = 0; x < CountX; ++x)
            {
                ChoseColor(target, nowFloorIndex, y, x);
                Gizmos.DrawSphere(from, PointR);
                from = from + offsetX;
            }
        }
    }
    static void DrawGrid(VoxelBuilder target)
    {
        var X = target.GetX(); var Y = target.GetY();
        var nowHeight = target.GetNowFlowerHeight();
        var original  = target.transform.position + nowHeight;

        //畫直線
        var yLine  = Y * VoxelBuilder.yUnit * Vector3.forward;
        var offset = VoxelBuilder.xUnit * Vector3.right;
        var from   = original;

        for (var x = 1; x <= X + 1; ++x)
        {
            Gizmos.DrawLine(from, from + yLine);
            from = from + offset;
        }

        //畫橫線
        offset = VoxelBuilder.yUnit * Vector3.forward;
        var xLine = X * VoxelBuilder.xUnit * Vector3.right;;

        from = original;
        for (var y = 1; y <= Y + 1; ++y)
        {
            Gizmos.DrawLine(from, from + xLine);
            from = from + offset;
        }
    }
Beispiel #3
0
    // Use this for initialization
    void Start()
    {
        //读入文件数据
        Stream sw = new MemoryStream(_file.bytes);

        System.IO.BinaryReader br = new System.IO.BinaryReader(sw);

        //从文件中解析MagicaVoxel文件,并转化成通用格式
        MagicaVoxel magica = MagicaVoxelFormater.ReadFromBinary(br);
        VoxelStruct vs     = magica.vs;


        //拿出体素数据
        VoxelData[] datas = vs.datas.ToArray();


        //创建体素“产品”
        VoxelProduct product = new VoxelProduct();

        //将数据写入产品
        (new VoxelData2Point(datas)).build(product);
        //切成8x8x8立方体,为了等下减面的时间可控,如果不切割的话,对于大模型减面时间太长
        (new VoxelSplitSmall(new VectorInt3(8, 8, 8))).build(product);
        //构造模型
        (new VoxelMeshBuild()).build(product);
        //减去重复的顶点
        (new VoxelRemoveSameVertices()).build(product);

        //减去重复的面
        (new VoxelRemoveFace()).build(product);
        //减去重复的顶点(在减面过程中出现的重复顶点)
        (new VoxelRemoveSameVertices()).build(product);

        //得到模型数据
        VoxelMeshData data = product.getMeshData();

        //以上是通过体素生成模型数据的代码,如果有别的算法生成,可以直接走下面代码

        //通过模型数据生成Mesh 和 MeshFilter。
        Mesh       mesh   = VoxelBuilder.Data2Mesh(data);
        MeshFilter filter = VoxelBuilder.Mesh2Filter(mesh);

        //别忘了加上材质。
        VoxelBuilder.FilterAddRenderer(filter, _material);


        //设置模型的坐标和名称等。
        filter.transform.SetParent(this.transform);
        filter.transform.localEulerAngles = Vector3.zero;
        filter.transform.localPosition    = data.offset;
        filter.name = "Voxel";
    }
Beispiel #4
0
    //public TextAsset _file = null;
    // Use this for initialization
    void Start()
    {
        //这里用程序创建5个voxel
        VoxelData[] datas = new VoxelData[5];


        //分别设置颜色和坐标
        datas [0] = new VoxelData(new VectorInt3(0, 0, 0), Color.white);
        datas [1] = new VoxelData(new VectorInt3(0, 1, 0), Color.green);
        datas [2] = new VoxelData(new VectorInt3(0, -1, 0), Color.yellow);
        datas [3] = new VoxelData(new VectorInt3(1, 0, 0), Color.red);
        datas [4] = new VoxelData(new VectorInt3(-1, 0, 0), Color.blue);


        //创建体素“产品”
        VoxelProduct product = new VoxelProduct();

        //将数据写入产品
        (new VoxelData2Point(datas)).build(product);
        //切成8x8x8立方体,为了等下减面的时间可控,如果不切割的话,对于大模型减面时间太长
        (new VoxelSplitSmall(new VectorInt3(8, 8, 8))).build(product);
        //构造模型
        (new VoxelMeshBuild()).build(product);
        //减去重复的顶点
        (new VoxelRemoveSameVertices()).build(product);

        //减去重复的面
        (new VoxelRemoveFace()).build(product);
        //减去重复的顶点(在减面过程中出现的重复顶点)
        (new VoxelRemoveSameVertices()).build(product);

        //得到模型数据
        VoxelMeshData data = product.getMeshData();

        //以上是通过体素生成模型数据的代码,如果有别的算法生成,可以直接走下面代码

        //通过模型数据生成Mesh 和 MeshFilter。
        Mesh       mesh   = VoxelBuilder.Data2Mesh(data);
        MeshFilter filter = VoxelBuilder.Mesh2Filter(mesh);

        //别忘了加上材质。
        VoxelBuilder.FilterAddRenderer(filter, _material);


        //设置模型的坐标和名称等。
        filter.transform.SetParent(this.transform);
        filter.transform.localEulerAngles = Vector3.zero;
        filter.transform.localPosition    = data.offset;
        filter.name = "Voxel";
    }
 static void ChoseColor(VoxelBuilder target, int nowFloorIndex, int y, int x)
 {
     if (target.IsSetValue(nowFloorIndex, y, x))
     {
         Gizmos.color = SetValueColor;
     }
     else if (x % 2 == 0 && y % 2 == 0)
     {
         Gizmos.color = EvenPointColor;
     }
     else
     {
         Gizmos.color = OddPointColor;
     }
 }
    static void DrawGizmoFor(VoxelBuilder target, GizmoType gizmoType)
    {
        DrawGrid(target);
        DrawMap(target);

        //畫Ray
        Gizmos.color = ClickPointColor;
        var clickPointOnRay = target.GetClickPointOnRay();

        Gizmos.DrawSphere(clickPointOnRay, DebugHitR);
        Gizmos.DrawLine(clickPointOnRay, clickPointOnRay - target.GetClickNormalDir() * 10);

        //畫HitPoint
        Gizmos.color = HitPointColor;
        Gizmos.DrawSphere(target.GetHitPoint(), DebugHitR);
    }
Beispiel #7
0
 public ChunkEntity()
 {
     _voxelBuilder     = new VoxelBuilder();
     _terrainGenerator = new TerrainGenerator();
 }
 private void Awake()
 {
     voxelBuilder = GetComponent <VoxelBuilder>();
     rigidbody    = GetComponent <Rigidbody>();
 }
 void OnEnable()
 {
     voxelBuilder = (VoxelBuilder)target;
 }