Beispiel #1
0
void MeshManipulator::smoothSurface(const Ray * r)
{
	VertexAdjacency adj = m_topo->getAdjacency(m_intersect->m_componentIdx);
	
	Vector3F *p = &m_mesh->vertices()[m_intersect->m_componentIdx];
    Vector3F d = adj.center() - *p;
	*p += d * .7f;
	
	Plane pl(m_intersect->m_hitN, m_intersect->m_hitP);

    Vector3F hit;
    float t;
	if(!pl.rayIntersect(*r, hit, t, 1)) return;
	
	d = hit - *p;
	float minD = d.length();
	float curD;
	
	VertexAdjacency::VertexNeighbor *neighbor;
    for(neighbor = adj.firstNeighbor(); !adj.isLastNeighbor(); neighbor = adj.nextNeighbor()) {
        d = hit - *(neighbor->v->m_v);
        curD = d.length();
		if(curD < minD) {
			minD = curD;
			m_intersect->m_componentIdx = neighbor->v->getIndex();
		}
    }
}
Beispiel #2
0
char VertexPath::recursiveFindClosestNeighbor(unsigned vert, unsigned endVert, const Vector3F & endPoint)
{
	VertexAdjacency adj = m_topology->getAdjacency(vert);
	Vector3F vertP = *(adj.m_v);
    unsigned closestNei;
    float minDist = 10e8;
    for(VertexAdjacency::VertexNeighbor * nei = adj.firstNeighbor(); !adj.isLastNeighbor(); nei = adj.nextNeighbor()) {
        if(nei->v->getIndex() == endVert) {
			m_vertices.push_back(endVert);
            return 1;
        }
        
        Vector3F p = *(nei->v->m_v);
        float dist = p.distanceTo(endPoint) + vertP.distanceTo(p);
        if(dist < minDist) {
            minDist = dist;
            closestNei = nei->v->getIndex();
        }
    }
    m_vertices.push_back(closestNei);
	if(m_vertices.size() > 64) return 1;
    return recursiveFindClosestNeighbor(closestNei, endVert, endPoint);
}