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)物体变形
最新推荐文章于 2023-10-20 17:44:01 发布