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; } }
// 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"; }
//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); }
public ChunkEntity() { _voxelBuilder = new VoxelBuilder(); _terrainGenerator = new TerrainGenerator(); }
private void Awake() { voxelBuilder = GetComponent <VoxelBuilder>(); rigidbody = GetComponent <Rigidbody>(); }
void OnEnable() { voxelBuilder = (VoxelBuilder)target; }