void changeMesh(string meshName,dvec3 hitPoint,double force,double radiu) { ObjectMeshDynamic m_mesh = node_cast(engine.editor.getNodeByName(meshName)); dvec3 Vertics[]; dvec3 bVertics[]; DeformMesh(m_mesh,hitPoint,force,radiu,Vertics,bVertics); for(int i = 0;i<Vertics.size();i++) { m_mesh.setVertex(i,Vertics[i]); } engine.profiler.begin("mesh"); m_mesh.updateBounds(); m_mesh.updateTangents(); m_mesh.flushVertex(); engine.profiler.end(); } void getMeshVertexArray(ObjectMeshDynamic m_mesh,dvec3 vertics[],dvec3 normals[]) { int nCount = m_mesh.getNumVertex(); for(int i = 0; i < nCount;i++) { vertics[i] = m_mesh.getVertex(i); normals[i] = m_mesh.getNormal(i); } } void DeformMesh(ObjectMeshDynamic m_mesh, dvec3 point, double lidu, double radiu,dvec3 Vertics[],dvec3 bVertics[]) { int nCount = m_mesh.getNumVertex(); dvec3 Normals[]; getMeshVertexArray(m_mesh,Vertics,Normals); for(int i = 0;i<Vertics.size();i++) { bVertics[i] = Vertics[i]; } double BanJing = radiu*radiu; dvec3 AverageNormal = dvec3(0.0f,0.0f,0.0f); //计算平均法线 for (int i = 0; i < Vertics.size(); i++) { //计算筛选范围 double SqrDis = sqrMagnitude(Vertics[i] ,point); if (SqrDis > BanJing) { continue; } double Distance = sqrt(SqrDis); //权重因子 double Falloff = LinearFalloff(Distance, radiu); //平均法线 AverageNormal += Normals[i] * Falloff; } AverageNormal = normalize(AverageNormal); //遍历定点,修改网格 for (int i = 0; i < Vertics.size(); i++) { //计算筛选范围 double SqrDis = sqrMagnitude(Vertics[i] , point); if (SqrDis > BanJing) { continue; } double Distance = sqrt(SqrDis); //高斯模糊 double Ffalloff=GaussFalloff(Distance,radiu); //顶点修改 Vertics[i] -= AverageNormal * Ffalloff * lidu; } } //线性变化 double LinearFalloff(double distances, double inradius) { return clamp01(1.0f - distances / inradius); } double GaussFalloff(double distance, double inRadius) { return clamp01(pow(360.0f, -pow(distance / inRadius, 2.5f) - 0.01f)); } /*限制数值在0.0f ~ 1.0f 之间*/ double clamp01(double value) { if(value < 0) return 0.0f; if(value > 1) return 1.0f; return value; }
在unigine中利用高斯变换使(ObjectMeshDynamic)物体变形
猜你喜欢
转载自blog.csdn.net/csp123258/article/details/69258087
今日推荐
周排行