示例#1
0
    public void Generate(VertexParametrization surfaceVertexParam)
    {
        float oneOverResXMinusOne = 1f / (resolutionX - 1f);
        float oneOverResYMinusOne = 1f / (resolutionY - 1f);

        for (int y = 0; y < resolutionY; ++y) {
            float normY = y * oneOverResYMinusOne;

            for (int x = 0; x < resolutionX; ++x) {
                float normX = x * oneOverResXMinusOne;

                Vertex vert = surfaceVertexParam(normX, normY);

                if (vertices != null) {
                    vertices[vertexOffset] = vert.position;
                }

                if (normals != null) {
                    if (autoGenerateNormalsArray) {
                        normals[vertexOffset] = Vector3.Cross(
                            computeSurfaceYDerivative(surfaceVertexParam, normX, normY, vert.position, derivativeResolution),
                            computeSurfaceXDerivative(surfaceVertexParam, normX, normY, vert.position, derivativeResolution)
                        ).normalized;
                    } else {
                        normals[vertexOffset] = vert.normal;
                    }
                }

                if (uvs != null) {
                    uvs[vertexOffset] = vert.uv;
                }

                if (colors != null) {
                    colors[colorOffset++] = vert.color;
                }

                if (indices != null && x < resolutionX - 1 && y < resolutionY - 1) {
                    if (makeClockwiseTriangles) {
                        makeTriangle(vertexOffset, vertexOffset + 1, vertexOffset + resolutionX);
                        makeTriangle(vertexOffset + 1, vertexOffset + resolutionX + 1, vertexOffset + resolutionX);
                    } else {
                        makeTriangle(vertexOffset + resolutionX, vertexOffset + 1, vertexOffset);
                        makeTriangle(vertexOffset + resolutionX, vertexOffset + resolutionX + 1, vertexOffset + 1);
                    }
                }

                ++vertexOffset;
            }
        }
    }
示例#2
0
 private static Vector3 computeSurfaceYDerivative(VertexParametrization surfaceParam, float x, float y, Vector3 surfaceParamOfxy, float h)
 {
     return (surfaceParam(x, y + h).position - surfaceParamOfxy) / h;
 }