在unigine中利用高斯变换使(ObjectMeshDynamic)物体变形

来源:互联网 发布:上海达内java教育地址 编辑:程序博客网 时间:2024/05/18 01:08

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;}


0 0
原创粉丝点击