CalculateNormals() private method

private CalculateNormals ( ) : Vector3[]
return Vector3[]
コード例 #1
0
    // Use this for initialization
    void Start()
    {
        float voxelSize = 1.0f;
        int   size      = 33;

        Array3 <Voxel> voxels = WorldGenerator.CreateVoxels(size, 0, voxelSize, Vector3.zero);
        MeshData       data   = MarchingCubes.CalculateMeshData(voxels, voxelSize);

        data.CalculateNormals();

        Mesh mesh = null;

        if (data != null)
        {
            mesh = data.CreateMesh();
        }

        ChunkObject obj = SplitManager.GetObject();

        obj.ov.shouldDraw = true;
        obj.mr.material   = mat;
        obj.mf.mesh       = mesh;


        Vector3 center = Vector3.one * (size - 1) / 2.0f;
        Bounds  area   = new Bounds(center, Vector3.one * voxelSize * (size - 1));

        obj.ov.init(0, 0, center, area, null, Color.red);
    }
コード例 #2
0
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            for (int i = 0; i < 1000; ++i)
            {
                var edgeCost = simp.costs.RemoveFront();
                simp.CollapseEdge(edgeCost);
            }

            simp.ToMesh(out data.vertices, out data.triangles);
            if (go.mf.sharedMesh != null)
            {
                Destroy(go.mf.sharedMesh);
            }
            data.CalculateNormals();

            if (Input.GetKey(KeyCode.LeftShift))
            {
                data.SplitEdgesCalcSmoothness();
            }

            mesh             = data.CreateMesh();
            go.mf.sharedMesh = mesh;
        }
    }
コード例 #3
0
    // Loads a given OBJ file, calculates its surface normals and displays it
    public void ShowMesh()
    {
        meshData = parser.parse(OBJFile);

        if (isFlatShaded)
        {
            meshData.MakeFlatShaded();
        }
        meshData.CalculateNormals();

        meshFilter.mesh = meshData.ToUnityMesh();
    }
コード例 #4
0
ファイル: TerrainMeshGenerator.cs プロジェクト: Killir/Mapa
    public static Mesh CreateTerrain(float[,] noiseMap, float heightMultiplier, AnimationCurve heightCurve, int LOD)
    {
        MeshData meshData = GenerateTerrainMeshData(noiseMap, heightMultiplier, heightCurve, LOD);

        Mesh mesh = new Mesh();

        mesh.vertices  = meshData.GetVertices();
        mesh.triangles = meshData.GetTriangles();
        mesh.uv        = meshData.GetUV();
        mesh.normals   = meshData.CalculateNormals();
        return(mesh);
    }
コード例 #5
0
    void Start()
    {
        voxels = WorldGenerator.CreateVoxels(65, 0, 1, Vector3.zero);

        data = MarchingCubes.CalculateMeshData(voxels, 1);
        data.CalculateVertexSharing();
        data.CalculateNormals();

        simp = new Simplification(data.vertices, data.triangles);

        mesh = data.CreateMesh();

        go               = SplitManager.GetObject();
        go.mr.material   = mat;
        go.mf.sharedMesh = mesh;
    }
コード例 #6
0
    public static MeshData Poligonyze(IPoligonyzable source, Bounds bounds, Vector3 resolution, float isolevel)
    {
        MeshData meshData = new MeshData();

        Grid[] grid = new Grid[8];

        for (float x = bounds.min.x; x <= bounds.max.x - resolution.x; x += resolution.x)
        {
            for (float y = bounds.min.y; y <= bounds.max.y - resolution.y; y += resolution.y)
            {
                for (float z = bounds.min.z; z <= bounds.max.z - resolution.z; z += resolution.z)
                {
                    // The weird array indices are due to how the lookup arrays are made
                    grid[3] = new Grid(x, y, z,
                                       source.Sample(x, y, z));
                    grid[2] = new Grid(x + resolution.x, y, z,
                                       source.Sample(x + resolution.x, y, z));
                    grid[1] = new Grid(x + resolution.x, y, z + resolution.z,
                                       source.Sample(x + resolution.x, y, z + resolution.z));
                    grid[0] = new Grid(x, y, z + resolution.z,
                                       source.Sample(x, y, z + resolution.z));

                    grid[7] = new Grid(x, y + resolution.y, z,
                                       source.Sample(x, y + resolution.y, z));
                    grid[6] = new Grid(x + resolution.x, y + resolution.y, z,
                                       source.Sample(x + resolution.x, y + resolution.y, z));
                    grid[5] = new Grid(x + resolution.x, y + resolution.y, z + resolution.z,
                                       source.Sample(x + resolution.x, y + resolution.y, z + resolution.z));
                    grid[4] = new Grid(x, y + resolution.y, z + resolution.z,
                                       source.Sample(x, y + resolution.y, z + resolution.z));

                    ProcessPoint(isolevel, grid, meshData);
                }
            }
        }

        meshData.CalculateNormals();

        return(meshData);
    }
コード例 #7
0
    public MeshData GenerateMesh(bool createVoxels)
    {
        // so while SIZE is 16, which means theres 16 cells/blocks in grid
        // you need 17 values to be able to construct those blocks
        // (think of 17 points in a grid and the blocks are the 16 spaces in between)
        // if smoothing then need a buffer of 2 around (front and back so +4) for smoothing and normal calculation
        // (so mesh goes from 2-19 basically (0, 1, 20, 21) are not visible in final result)

#if (SMOOTH_SHADING)
        if (createVoxels)
        {
            voxels = WorldGenerator.CreateVoxels(SIZE + 5, depth, voxelSize, pos);
        }
        MeshData data = MarchingCubes.CalculateMeshData(voxels, voxelSize, 2, 2);
        data.CalculateVertexSharing();
        //Simplification simp = new Simplification(data.vertices, data.triangles);
        //data.normals = VoxelUtils.CalculateSmoothNormals(voxels, voxelSize, data.vertices);
        //data.SplitEdgesCalcSmoothness();
        data.CalculateSharedNormals();  // todo figure out why this doesnt make it smoothed...
#else
        if (createVoxels)
        {
            voxels = WorldGenerator.CreateVoxels(SIZE + 1, depth, voxelSize, worldPos);
        }

        //if (!needsMesh) {
        //    return null;
        //}

        //MeshData data = MarchingTetrahedra.CalculateMeshData(voxels, voxelSize);

        MeshData data = MarchingCubes.CalculateMeshData(voxels, voxelSize);
        data.CalculateNormals();
#endif

        //data.CalculateColorsByDepth(depth);
        return(data);
    }
コード例 #8
0
ファイル: Test.cs プロジェクト: TommasoBianchi/VoxelHoles
    void SpawnMap()
    {
        MeshData meshData = new MeshData();

        Vector3Int[] directions = new Vector3Int[]
        {
            new Vector3Int(1, 0, 0),
            new Vector3Int(-1, 0, 0),
            new Vector3Int(0, 1, 0),
            new Vector3Int(0, -1, 0),
            new Vector3Int(0, 0, 1),
            new Vector3Int(0, 0, -1)
        };

        // Invert y and z for visualization purposes
        voxelMap.Foreach((x, y, z, voxelPresent) =>
        {
            if (voxelPresent)
            {
                //Instantiate(voxelPrefab, new Vector3(x, y, z), Quaternion.identity, transform);

                for (int i = 0; i < directions.Length; i++)
                {
                    if (voxelMap.CheckVoxelAt(x + directions[i].x, y + directions[i].y, z + directions[i].z) == false)
                    {
                        CreateSquare(new Vector3Int(x, y, z), meshData, directions[i]);
                    }
                }
            }
        });

        meshData.CalculateNormals();

        ThreadWorkManager.RequestMainThreadWork(() =>
        {
            GameObject go = new GameObject();
            go.AddComponent <MeshFilter>().mesh             = meshData.ToMesh();
            go.AddComponent <MeshRenderer>().sharedMaterial = voxelMaterial;
            go.transform.rotation = Quaternion.Euler(-90, 0, 0);

            /*MeshData m = new MeshData();
             *
             * //CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(1, 0, 0));
             * CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(-1, 0, 0));
             * CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(0, 1, 0));
             * CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(0, -1, 0));
             * //CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(0, 0, 1));
             * CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(0, 0, -1));
             *
             * CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(1, 0, 0));
             * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(-1, 0, 0));
             * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, 1, 0));
             * CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, -1, 0));
             * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, 0, 1));
             * CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, 0, -1));
             *
             * CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(1, 0, 0));
             * CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(-1, 0, 0));
             * CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, 1, 0));
             * //CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, -1, 0));
             * //CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, 0, 1));
             * CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, 0, -1));
             *
             * //CreateSquare(new Vector3Int(100, 100, 100), m, new Vector3Int(1, 0, 0));
             * CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(-1, 0, 0));
             * CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(0, 1, 0));
             * CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(0, -1, 0));
             * CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(0, 0, 1));
             * //CreateSquare(new Vector3Int(100, 100, 101), m, new Vector3Int(0, 0, -1));
             *
             * CreateSquare(new Vector3Int(101, 100, 101), m, new Vector3Int(1, 0, 0));
             * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(-1, 0, 0));
             * //CreateSquare(new Vector3Int(101, 100, 100), m, new Vector3Int(0, 1, 0));
             * CreateSquare(new Vector3Int(101, 100, 101), m, new Vector3Int(0, -1, 0));
             * CreateSquare(new Vector3Int(101, 100, 101), m, new Vector3Int(0, 0, 1));
             * //CreateSquare(new Vector3Int(101, 100, 101), m, new Vector3Int(0, 0, -1));
             *
             * CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(1, 0, 0));
             * CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(-1, 0, 0));
             * CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(0, 1, 0));
             * //CreateSquare(new Vector3Int(101, 101, 100), m, new Vector3Int(0, -1, 0));
             * CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(0, 0, 1));
             * //CreateSquare(new Vector3Int(101, 101, 101), m, new Vector3Int(0, 0, -1));
             *
             * m.Smooth();
             * go = new GameObject();
             * go.AddComponent<MeshFilter>().mesh = m.ToMesh();
             * go.AddComponent<MeshRenderer>().sharedMaterial = voxelMaterial;*/
        });
    }
コード例 #9
0
        public void RecreateMesh()
        {
            System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();

            s.Start();

            if (mesh != null)
            {
                mesh.VertexBuffer.Dispose();
                mesh.IndexBuffer.Dispose();
                mesh = null;
            }

            //s.Stop();

            //s.Start();

            MeshData data = new MeshData();

            for (int x = 0; x < Size; x++)
            {
                for (int y = 0; y < Size; y++)
                {
                    for (int z = 0; z < Size; z++)
                    {
                        blocks[x, y, z].GetMeshData(data, this, x, y, z);
                    }
                }
            }

            s.Stop();

            Console.WriteLine(s.Elapsed.Ticks);

            s.Restart();

            data.CalculateNormals();

            if (data.Vertices.Count > 0)
            {
                mesh = new ModelMeshPart();

                mesh.VertexBuffer = new VertexBuffer(Game3DPlatformer.Instance.GraphicsDevice, typeof(VertexPositionNormalTexture), data.Vertices.Count, BufferUsage.WriteOnly);
                mesh.IndexBuffer  = new IndexBuffer(Game3DPlatformer.Instance.GraphicsDevice, typeof(short), data.Indices.Count, BufferUsage.WriteOnly);

                mesh.VertexBuffer.SetData(data.Vertices.Select((v, i) => new VertexPositionNormalTexture(v, data.Normals[i], data.UV[i])).ToArray());
                mesh.IndexBuffer.SetData(data.Indices.ToArray());

                mesh.NumVertices    = data.Vertices.Count;
                mesh.PrimitiveCount = data.Indices.Count / 3;

                //meshPart.Effect = Game3DPlatformer.Instance.BasicEffect;

                //mesh = new ModelMesh(Game3DPlatformer.Instance.GraphicsDevice, new List<ModelMeshPart> { meshPart });
                //mesh.Effects = new ModelEffectCollection(new List<Effect> { Game3DPlatformer.Instance.BasicEffect });
            }
            else
            {
                mesh = null;
            }

            s.Stop();

            Console.WriteLine(s.Elapsed.Ticks);
            Console.WriteLine("--");
        }