public void TestCase3() { using (var stream = File.OpenRead("3x3x3.vox")) { var voxelData = MagicaVoxel.Read(stream); Assert.AreEqual(3, AmbientOcclusion.CalculateAO(voxelData, new XYZ(2, 2, 2), XYZ.OneY, XYZ.OneX, XYZ.OneZ)); } }
public void Test8x8x8() { using (var stream = File.OpenRead("8x8x8.vox")) { var voxelData = MagicaVoxel.Read(stream); Assert.AreEqual(80, voxelData.Count); } }
public void Test1x2x3() { using (var stream = File.OpenRead("1x2x3.vox")) { var voxelData = MagicaVoxel.Read(stream); Assert.AreEqual(6, voxelData.Count); Assert.AreEqual(1, voxelData.size.X); Assert.AreEqual(2, voxelData.size.Y); Assert.AreEqual(3, voxelData.size.Z); } }
public void TestCaseComplex() { using (var stream = File.OpenRead("2x2x2.vox")) { var voxelData = MagicaVoxel.Read(stream); Assert.AreEqual(0, AmbientOcclusion.CalculateAO(voxelData, new XYZ(0, 0, 0), XYZ.OneY, XYZ.OneX, XYZ.OneZ)); Assert.AreEqual(0, AmbientOcclusion.CalculateAO(voxelData, new XYZ(0, 1, 1), XYZ.OneX, -XYZ.OneZ, -XYZ.OneY)); Assert.AreEqual(0, AmbientOcclusion.CalculateAO(voxelData, new XYZ(1, 0, 1), -XYZ.OneZ, XYZ.OneY, -XYZ.OneX)); Assert.AreEqual(2, AmbientOcclusion.CalculateAO(voxelData, new XYZ(0, 0, 0), -XYZ.OneX, XYZ.OneY, XYZ.OneZ)); Assert.AreEqual(2, AmbientOcclusion.CalculateAO(voxelData, new XYZ(0, 0, 0), XYZ.OneX, -XYZ.OneY, XYZ.OneZ)); Assert.AreEqual(3, AmbientOcclusion.CalculateAO(voxelData, new XYZ(0, 0, 0), -XYZ.OneX, -XYZ.OneY, XYZ.OneZ)); } }
// 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 void VoxelFormaterTest() { //Arrange // var gameObject = new GameObject(); //Act //Try to rename the GameObject // var newGameObjectName = "My game object"; //gameObject.name = newGameObjectName; //VoxelWriter writer = gameObject.GetComponent<VoxelWriter> (); //VoxelFormater formater = gameObject.GetComponent<VoxelFormater> (); FileStream sr = new FileStream(".//Assets//Voxel//chr_cop2.bytes", FileMode.OpenOrCreate, FileAccess.Read); System.IO.BinaryReader br = new System.IO.BinaryReader(sr); MagicaVoxel magic = MagicaVoxelFormater.ReadFromBinary(br); FileStream sw = new FileStream("fly2.vox", FileMode.Create, FileAccess.Write); System.IO.BinaryWriter bw = new System.IO.BinaryWriter(sw); MagicaVoxelFormater.WriteToBinary(magic.structure, bw); sw.Close(); sr.Close(); FileStream sr2 = new FileStream("fly2.vox", FileMode.OpenOrCreate, FileAccess.Read); System.IO.BinaryReader br2 = new System.IO.BinaryReader(sr2); MagicaVoxel magic2 = MagicaVoxelFormater.ReadFromBinary(br2); Assert.AreEqual(magic.main.name, magic2.main.name); Assert.AreEqual(magic.main.size, magic2.main.size); Assert.AreEqual(magic.main.chunks, magic2.main.chunks); Assert.AreEqual(magic.size.box, magic2.size.box); Assert.AreEqual(magic.size.name, magic2.size.name); Assert.AreEqual(magic.size.size, magic2.size.size); Assert.AreEqual(magic.size.chunks, magic2.size.chunks); Assert.AreEqual(magic.rgba.palette.Length, magic2.rgba.palette.Length); for (int i = 0; i < magic.rgba.palette.Length; ++i) { Assert.AreEqual(magic.rgba.palette[i], magic2.rgba.palette[i]); } // Debug.Log (vs2.rgba.palette.Length); Assert.AreEqual(magic.rgba.name, magic2.rgba.name); Assert.AreEqual(magic.rgba.size, magic2.rgba.size); Assert.AreEqual(magic.rgba.chunks, magic2.rgba.chunks); sr2.Close(); for (int i = 0; i < MagicaVoxelFormater.palette_.Length; ++i) { ushort s = MagicaVoxelFormater.palette_ [i]; Color c = MagicaVoxelFormater.Short2Color(s); ushort s2 = MagicaVoxelFormater.Color2Short(c); Color c2 = MagicaVoxelFormater.Short2Color(s2); Assert.AreEqual(s, s2); Assert.AreEqual(c, c2); } //Debug.Log (); Assert.AreEqual(magic.structure.count, magic2.structure.count); // Debug.Log (vs2.datas.Length); for (int i = 0; i < magic.structure.count; ++i) { Assert.AreEqual(magic.structure.getData(i).color, magic2.structure.getData(i).color); Assert.AreEqual(magic.structure.getData(i).position.x, magic2.structure.getData(i).position.x); Assert.AreEqual(magic.structure.getData(i).position.y, magic2.structure.getData(i).position.y); Assert.AreEqual(magic.structure.getData(i).position.z, magic2.structure.getData(i).position.z); } Assert.AreEqual(magic.structure.count, magic.structure.count); }