From 522fa70a22811dd5efc056bae4458dfafbfb54fd Mon Sep 17 00:00:00 2001 From: zz85 Date: Tue, 11 Oct 2011 00:09:24 +0800 Subject: [PATCH] Fixed sharp corners for Subdivision Modifier --- src/extras/modifiers/SubdivisionModifier.js | 186 ++++++++++++++------ 1 file changed, 129 insertions(+), 57 deletions(-) diff --git a/src/extras/modifiers/SubdivisionModifier.js b/src/extras/modifiers/SubdivisionModifier.js index 151d78c0..5ee7de5b 100644 --- a/src/extras/modifiers/SubdivisionModifier.js +++ b/src/extras/modifiers/SubdivisionModifier.js @@ -11,6 +11,15 @@ * Readings: * http://en.wikipedia.org/wiki/Catmull%E2%80%93Clark_subdivision_surface * http://www.rorydriscoll.com/2008/08/01/catmull-clark-subdivision-the-basics/ + * http://xrt.wikidot.com/blog:31 + * "Subdivision Surfaces in Character Animation" + * + * Supports: + * Closed and Open geometries. + * + * TODO: + * crease vertex and "semi-sharp" features + * selective subdivision */ THREE.SubdivisionModifier = function( subdivisions ) { @@ -186,6 +195,8 @@ THREE.SubdivisionModifier.prototype.smooth = function ( oldGeometry ) { var facePoints = [], edgePoints = {}; + var sharpEdges = {}, sharpVertices = [], sharpFaces = []; + var uvForVertices = []; // Step 1 @@ -253,6 +264,80 @@ THREE.SubdivisionModifier.prototype.smooth = function ( oldGeometry ) { var edgeCount = 0; var originalVerticesLength = originalPoints.length; var edgeVertex, edgeVertexA, edgeVertexB; + + //// + + var vertexEdgeMap = {}; + var vertexFaceMap = {}; + + var addVertexEdgeMap = function(vertex, edge) { + if (vertexEdgeMap[vertex]===undefined) { + vertexEdgeMap[vertex] = []; + } + + vertexEdgeMap[vertex].push(edge); + }; + + var addVertexFaceMap = function(vertex, face, edge) { + if (vertexFaceMap[vertex]===undefined) { + vertexFaceMap[vertex] = {}; + } + + //vertexFaceMap[vertex][face] = edge; + vertexFaceMap[vertex][face] = null; + }; + + // Prepares vertexEdgeMap and vertexFaceMap + for (i in vfMap) { // This is for every edge + edge = vfMap[i]; + + edgeVertex = i.split('_'); + edgeVertexA = edgeVertex[0]; + edgeVertexB = edgeVertex[1]; + + // Maps an edgeVertex to connecting edges + addVertexEdgeMap(edgeVertexA, [edgeVertexA, edgeVertexB] ); + addVertexEdgeMap(edgeVertexB, [edgeVertexA, edgeVertexB] ); + + + // faceIndexA = edge[0]; // face index a + // faceIndexB = edge[1]; // face index b + // + // // Add connecting faces for edge + // addVertexFaceMap(edgeVertexA, faceIndexA); + // addVertexFaceMap(edgeVertexB, faceIndexA); + // + // + // if (faceIndexB) { + // addVertexFaceMap(edgeVertexA, faceIndexB); + // addVertexFaceMap(edgeVertexB, faceIndexB); + // } else { + // addVertexFaceMap(edgeVertexA, faceIndexA); + // addVertexFaceMap(edgeVertexB, faceIndexA); + // } + + for (j=0,jl=edge.length;j2) { + + } + + F.divideScalar(f); + + + for (j=0; j