public V3 Vector3ToV3(Vector3 vector3, float GridSize) { var v = VoxelRenderManager.Fixed(vector3, GridSize); var v3 = new V3(); v3.x = (int)(v.x / GridSize + 0.5f); v3.y = (int)(v.y / GridSize + 0.5f); v3.z = (int)(v.z / GridSize + 0.5f); return(v3); }
public void InitRender() { ClearVoxel(transform.Find("renderer")); if (renderRoot == null) { renderRoot = new GameObject("renderer").transform; renderRoot.parent = transform; renderRoot.localPosition = Vector3.zero; } int i = 0; voxels = new Transform[voxelData.voxels.Count]; foreach (var v in voxelData.voxels) { voxels[i] = VoxelRenderManager.CreateViewObj(voxelData, material, v, GridSize, renderRoot).transform; i++; } }
void CreateRenderData() { var texturePath = "Assets/Model/VoxelModelData/" + renderer.name + "_vr.png"; var tex = SavePng(VoxelRenderManager.CreatTexture(voxelData), texturePath); var materialPath = "Assets/Model/VoxelModelData/" + renderer.name + "_vr.mat"; renderer.material = SaveMat(VoxelRenderManager.CreateMaterial(voxelData, tex), materialPath); var maxVoxelCount = 5000; if (voxelData.voxels.Count > maxVoxelCount) { Debug.LogError("【VoxelRenderer】体素数目过大 " + voxelData.voxels.Count + "超过" + maxVoxelCount + " 中止生成显示块"); return; } //SaveVoxelData(); }
public void ParseMeshRendererToVoxel(float GridSize) { var mesh = MeshMerge(); if (mesh == null) { return; } var vertices = mesh.vertices; var normals = mesh.normals; Dictionary <V3, Color> colors = new Dictionary <V3, Color>(); for (int i = 0; i < vertices.Length; i++) { var v = Vector3ToV3(vertices[i] - normals[i] * GridSize / 2, GridSize); if (!colors.ContainsKey(v)) { var uv = new int[] { (int)(mesh.uv[i].x * newText.width), (int)(mesh.uv[i].y * newText.height) }; colors.Add(v, newText.GetPixel(uv[0], uv[1])); } } voxelData = VoxelRenderManager.Parse(colors); }
public void RenderVoxel(Transform voxel, Transform bone, Vector3 bindPose) { voxel.transform.rotation = Quaternion.identity; voxel.transform.position = VoxelRenderManager.Fixed(bone.transform.position - (bone.right * bindPose.x + bone.forward * bindPose.z + bone.up * bindPose.y), GridSize); }
public static VoxelData ReadData(BinaryReader reader) { var vox = reader.ReadBytes(4); if (!Compare("VOX ", vox)) { ErrorCantFind("VOX"); return(null); } var version = reader.ReadBytes(4); var main = reader.ReadBytes(4); if (!Compare("MAIN", main)) { ErrorCantFind("MAIN"); return(null); } var voxelData = VoxelRenderManager.GetData(); int mainSize = reader.ReadInt32(); int childSize = reader.ReadInt32(); reader.ReadBytes(mainSize); int readSize = 0; string unKnowNode = ""; while (readSize < childSize) { var nodeType = reader.ReadBytes(4); if (Compare("PACK", nodeType)) { int packDataSize = reader.ReadInt32(); int packChildSize = reader.ReadInt32(); reader.ReadInt32(); readSize += packDataSize + packChildSize + 4 * 3; } else if (Compare("SIZE", nodeType)) { readSize += ReadSize(reader, voxelData); } else if (Compare("XYZI", nodeType)) { readSize += ReadVoxelIndex(reader, voxelData); } else if (Compare("RGBA", nodeType)) { readSize += ReadColor(reader, voxelData); } else { var typeStr = System.Text.Encoding.ASCII.GetString(nodeType); if (!unKnowNode.Contains(typeStr)) { unKnowNode += "[" + typeStr + "]"; } int chunkContentBytes = reader.ReadInt32(); int childrenBytes = reader.ReadInt32(); reader.ReadBytes(chunkContentBytes + childrenBytes); readSize += chunkContentBytes + childrenBytes + 12; } } Warning(" 不支持解析节点类型 " + unKnowNode); Log(" 导入体素模型完成 体素数目" + voxelData.voxels.Count); return(voxelData); }