📄 clothsim.java
字号:
Geometry createClothSimGeometry()
{
clothSimArray =new TriangleArray((xTotal-1)*(yTotal-1)*2*3,TriangleArray.COORDINATES|TriangleArray.BY_REFERENCE|TriangleArray.NORMALS);
//创建ClothSim模型面阵列
clothSimArray.setCapability(GeometryArray.ALLOW_REF_DATA_READ);
clothSimArray.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
clothSimArray.setCapability(GeometryArray.ALLOW_COUNT_READ);
//设置clothSimArray的能力
float[] coordinatesClothSimArray = new float[(xTotal-1)*(yTotal-1)*2*3*3];//创建ClothSimArray顶点坐标数组
float[] normals=new float[(xTotal-1)*(yTotal-1)*2*3*3]; //创建ClothSimArray顶点法向量数组
int p;
int i=0;
int j=0;
for(p = 0; p < ((xTotal-1)*(yTotal-1))*2*3 ;p+=6)
{
coordinatesClothSimArray[p*3+0] = (float)pointPosition[i][j].x;
coordinatesClothSimArray[p*3+1] = (float)pointPosition[i][j].y;
coordinatesClothSimArray[p*3+2] =(float) pointPosition[i][j].z;
coordinatesClothSimArray[p*3+6] = (float)pointPosition[i][j+1].x;
coordinatesClothSimArray[p*3+7] = (float)pointPosition[i][j+1].y;
coordinatesClothSimArray[p*3+8] = (float)pointPosition[i][j+1].z;
coordinatesClothSimArray[p*3+3] = (float)pointPosition[i+1][j].x;
coordinatesClothSimArray[p*3+4] = (float)pointPosition[i+1][j].y;
coordinatesClothSimArray[p*3+5] = (float)pointPosition[i+1][j].z;
//初始三角面的顶点坐标
Vector3f a=new Vector3f((float)(pointPosition[i+1][j].x-pointPosition[i][j].x),(float)(pointPosition[i+1][j].y-pointPosition[i][j].y),(float)(pointPosition[i+1][j].z-pointPosition[i][j].z));
Vector3f b=new Vector3f((float)(pointPosition[i][j+1].x-pointPosition[i][j].x),(float)(pointPosition[i][j+1].y-pointPosition[i][j].y),(float)(pointPosition[i][j+1].z-pointPosition[i][j].z));
Vector3f n=new Vector3f();
n.cross(a,b);
normals[3*p+0]=n.x;
normals[3*p+1]=n.y;
normals[3*p+2]=n.z;
normals[3*p+3]=n.x;
normals[3*p+4]=n.y;
normals[3*p+5]=n.z;
normals[3*p+6]=n.x;
normals[3*p+7]=n.y;
normals[3*p+8]=n.z;
//初始三角面的顶点法向量
coordinatesClothSimArray[p*3+9] = (float)pointPosition[i+1][j].x;
coordinatesClothSimArray[p*3+10] = (float)pointPosition[i+1][j].y;
coordinatesClothSimArray[p*3+11] =(float) pointPosition[i+1][j].z;
coordinatesClothSimArray[p*3+12] = (float)pointPosition[i+1][j+1].x;
coordinatesClothSimArray[p*3+13] = (float)pointPosition[i+1][j+1].y;
coordinatesClothSimArray[p*3+14] = (float)pointPosition[i+1][j+1].z;
coordinatesClothSimArray[p*3+15] = (float)pointPosition[i][j+1].x;
coordinatesClothSimArray[p*3+16] = (float)pointPosition[i][j+1].y;
coordinatesClothSimArray[p*3+17] = (float)pointPosition[i][j+1].z;
//初始三角面的顶点坐标
Vector3f c=new Vector3f((float)(pointPosition[i+1][j].x-pointPosition[i+1][j+1].x),(float)(pointPosition[i+1][j].y-pointPosition[i+1][j+1].y),(float)(pointPosition[i+1][j].z-pointPosition[i+1][j+1].z));
Vector3f d=new Vector3f((float)(pointPosition[i][j+1].x-pointPosition[i+1][j+1].x),(float)(pointPosition[i][j+1].y-pointPosition[i+1][j+1].y),(float)(pointPosition[i][j+1].z-pointPosition[i+1][j+1].z));
Vector3f n1=new Vector3f();
n1.cross(d,c);
n1.normalize();
normals[3*p+9]=n1.x;
normals[3*p+10]=n1.y;
normals[3*p+11]=n1.z;
normals[3*p+12]=n1.x;
normals[3*p+13]=n1.y;
normals[3*p+14]=n1.z;
normals[3*p+15]=n1.x;
normals[3*p+16]=n1.y;
normals[3*p+17]=n1.z;
//初始三角面的顶点法向量坐标
i++;
if(i==(xTotal-1))
{i=0;
j++;}
}//利用质点原始位置坐标初始ClothSimArray的定点坐标数组,定点向量数组
clothSimArray. setNormalRefFloat(normals);
//设置ClothSimArray的顶点向量数组
clothSimArray.setCoordRefFloat(coordinatesClothSimArray);
//设置ClothSimArray的顶点坐标数组
return clothSimArray;
}
//构建ClothSimFace三角面阵列外观
Appearance createClothSimAppearance()
{
Appearance appear = new Appearance();
Color3f red =new Color3f(1.0f,0.0f,0.0f);
Color3f white =new Color3f(0.0f,0.0f,0.0f);
PolygonAttributes polygona=new PolygonAttributes();
polygona.setCullFace(PolygonAttributes.CULL_NONE);
appear.setPolygonAttributes(polygona);
Material material = new Material();
material.setDiffuseColor(red);
material.setSpecularColor(white);
appear.setMaterial(material);
return appear;
}
}
/////////////////////////////////////////////////////////////
// clothSimUpdate面模型更新内部类 //
// //
// 更新面模型的质点顶点坐标数组,顶点法向量数组 //
// 并且优化法向量 //
// //
/////////////////////////////////////////////////////////////
//创建ClothSimFace三角面位置更新内部类
public class ClothSimUpdater implements GeometryUpdater
{
GeometryArray geometryArray;//更新对象
float[] vertices;//顶点数组
int N;//顶点总数
//ClothSimUpdater构造函数
public ClothSimUpdater()
{
}
//ClothSimUpdater更新函数
public void updateData(Geometry geometry){
geometryArray = (GeometryArray)geometry;//获得更新对象
vertices = geometryArray.getCoordRefFloat();//获得更新对象顶点数组
float[] normals=geometryArray.getNormalRefFloat();//获得更新对象顶点法向量数组
N = geometryArray.getValidVertexCount();//获得更新对象顶点总数
int p;
int i=0;
int j=0;
for(p = 0; p < ((xTotal-1)*(yTotal-1))*2*3 ;p+=6)
{
vertices[p*3+0] = (float)pointPosition[i][j].x;
vertices[p*3+1] = (float)pointPosition[i][j].y;
vertices[p*3+2] =(float) pointPosition[i][j].z;
vertices[p*3+3] = (float)pointPosition[i+1][j].x;
vertices[p*3+4] = (float)pointPosition[i+1][j].y;
vertices[p*3+5] = (float)pointPosition[i+1][j].z;
vertices[p*3+6] = (float)pointPosition[i][j+1].x;
vertices[p*3+7] = (float)pointPosition[i][j+1].y;
vertices[p*3+8] = (float)pointPosition[i][j+1].z;
Vector3f a=new Vector3f((float)(pointPosition[i+1][j].x-pointPosition[i][j].x),(float)(pointPosition[i+1][j].y-pointPosition[i][j].y),(float)(pointPosition[i+1][j].z-pointPosition[i][j].z));
Vector3f b=new Vector3f((float)(pointPosition[i][j+1].x-pointPosition[i][j].x),(float)(pointPosition[i][j+1].y-pointPosition[i][j].y),(float)(pointPosition[i][j+1].z-pointPosition[i][j].z));
Vector3f n=new Vector3f();
n.cross(a,b);
n.normalize();
normals[3*p+0]=n.x;
normals[3*p+1]=n.y;
normals[3*p+2]=n.z;
normals[3*p+3]=n.x;
normals[3*p+4]=n.y;
normals[3*p+5]=n.z;
normals[3*p+6]=n.x;
normals[3*p+7]=n.y;
normals[3*p+8]=n.z;
vertices[p*3+9] = (float)pointPosition[i+1][j].x;
vertices[p*3+10] = (float)pointPosition[i+1][j].y;
vertices[p*3+11] =(float) pointPosition[i+1][j].z;
vertices[p*3+12] = (float)pointPosition[i+1][j+1].x;
vertices[p*3+13] = (float)pointPosition[i+1][j+1].y;
vertices[p*3+14] = (float)pointPosition[i+1][j+1].z;
vertices[p*3+15] = (float)pointPosition[i][j+1].x;
vertices[p*3+16] = (float)pointPosition[i][j+1].y;
vertices[p*3+17] = (float)pointPosition[i][j+1].z;
Vector3f c=new Vector3f((float)(pointPosition[i+1][j].x-pointPosition[i+1][j+1].x),(float)(pointPosition[i+1][j].y-pointPosition[i+1][j+1].y),(float)(pointPosition[i+1][j].z-pointPosition[i+1][j+1].z));
Vector3f d=new Vector3f((float)(pointPosition[i][j+1].x-pointPosition[i+1][j+1].x),(float)(pointPosition[i][j+1].y-pointPosition[i+1][j+1].y),(float)(pointPosition[i][j+1].z-pointPosition[i+1][j+1].z));
Vector3f n1=new Vector3f();
n1.cross(a,b);
n1.normalize();
normals[3*p+9]=n1.x;
normals[3*p+10]=n1.y;
normals[3*p+11]=n1.z;
normals[3*p+12]=n1.x;
normals[3*p+13]=n1.y;
normals[3*p+14]=n1.z;
normals[3*p+15]=n1.x;
normals[3*p+16]=n1.y;
normals[3*p+17]=n1.z;
i++;
if(i==(xTotal-1))
{i=0;
j++;}
}//更新ClothSimFace的顶点坐标数组,顶点向量数组
p=0;
for(i=0;i<(xTotal-1);i++)
for(j=0;j<(yTotal-1);j++)
{
Vector3f normalsAverage=new Vector3f(0.0f,0.0f,0.0f);
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*j+2*i)*3*3+0]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*j+2*i)*3*3+1]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*j+2*i)*3*3+2]) ;
p++;
if(i!=0)
{p+=2;
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*j+2*(i-1))*3*3+3]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*j+2*(i-1))*3*3+4]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*j+2*(i-1))*3*3+5]);
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*j+2*(i-1))*3*3+9]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*j+2*(i-1))*3*3+10]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*j+2*(i-1))*3*3+11]);
}
if(i!=0&j!=0)
{p++;
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*(j-1)+2*(i-1))*3*3+12]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*(j-1)+2*(i-1))*3*3+13]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*(j-1)+2*(i-1))*3*3+14]);
}
if(j!=0)
{p+=2;
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+6]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+7]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+8]);
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+15]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+16]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+17]);
}
normalsAverage.x=NormalsAverage(normalsAverage.x,p);
normalsAverage.y= NormalsAverage(normalsAverage.y,p);
normalsAverage.z=NormalsAverage(normalsAverage.z,p);
pointNormal[i][j].x=(double)normalsAverage.x;
pointNormal[i][j].y=(double)normalsAverage.y;
pointNormal[i][j].z=(double)normalsAverage.z;
normals[((xTotal-1)*2*j+2*i)*3*3+0]=normalsAverage.x;
normals[((xTotal-1)*2*j+2*i)*3*3+1]=normalsAverage.y;
normals[((xTotal-1)*2*j+2*i)*3*3+2]=normalsAverage.z;
if(i!=0) {
normals[((xTotal-1)*2*j+2*(i-1))*3*3+3]=normalsAverage.x;
normals[((xTotal-1)*2*j+2*(i-1))*3*3+4]=normalsAverage.y;
normals[((xTotal-1)*2*j+2*(i-1))*3*3+5]=normalsAverage.z;
normals[((xTotal-1)*2*j+2*(i-1))*3*3+9]=normalsAverage.x;
normals[((xTotal-1)*2*j+2*(i-1))*3*3+10]=normalsAverage.y;
normals[((xTotal-1)*2*j+2*(i-1))*3*3+11]=normalsAverage.z;
}
if(i!=0&j!=0) {normals[((xTotal-1)*2*(j-1)+2*(i-1))*3*3+12]=normalsAverage.x;
normals[((xTotal-1)*2*(j-1)+2*(i-1))*3*3+13]=normalsAverage.y;
normals[((xTotal-1)*2*(j-1)+2*(i-1))*3*3+14]=normalsAverage.z;
}
if(j!=0) { normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+6]= normalsAverage.x;
normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+7]=normalsAverage.y;
normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+8]=normalsAverage.z;
normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+15]= normalsAverage.x;
normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+16]=normalsAverage.y;
normals[((xTotal-1)*2*(j-1)+2*(i))*3*3+17]=normalsAverage.z;}
}
p=0;
for(j=0;j<(yTotal-1);j++)
{
Vector3f normalsAverage=new Vector3f(0.0f,0.0f,0.0f);
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+3]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+4]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+5]) ;
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+9]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+10]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+11]);
p+=2;
if(j!=0)
{
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*(j-1)+2*(xTotal-2))*3*3+12]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*(j-1)+2*(xTotal-2))*3*3+13]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*(j-1)+2*(xTotal-2))*3*3+14]);
p++;
}
normalsAverage.x=NormalsAverage(normalsAverage.x,p);
normalsAverage.y= NormalsAverage(normalsAverage.y,p);
normalsAverage.z=NormalsAverage(normalsAverage.z,p);
pointNormal[i][j].x=(double)normalsAverage.x;
pointNormal[i][j].y=(double)normalsAverage.y;
pointNormal[i][j].z=(double)normalsAverage.z;
normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+3]= normalsAverage.x;
normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+4]=normalsAverage.y;
normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+5]=normalsAverage.z;
normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+9]= normalsAverage.x;
normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+10]=normalsAverage.y;
normals[((xTotal-1)*2*j+2*(xTotal-2))*3*3+11]=normalsAverage.z;
if(j!=0)
{
normals[((xTotal-1)*2*(j-1)+2*(xTotal-2))*3*3+12]= normalsAverage.x;
normals[((xTotal-1)*2*(j-1)+2*(xTotal-2))*3*3+13]=normalsAverage.y;
normals[((xTotal-1)*2*(j-1)+2*(xTotal-2))*3*3+14]=normalsAverage.z;
}
}
p=0;
for(i=0;i<(xTotal-1);i++)
{
Vector3f normalsAverage=new Vector3f(0.0f,0.0f,0.0f);
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+6]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+7]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+8]) ;
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+15]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+16]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+17]);
p+=2;
if(i!=0)
{
normalsAverage.x=NormalsAdd(normalsAverage.x,normals[((xTotal-1)*2*(yTotal-2)+2*(i-1))*3*3+12]) ;
normalsAverage.y=NormalsAdd(normalsAverage.y,normals[((xTotal-1)*2*(yTotal-2)+2*(i-1))*3*3+13]) ;
normalsAverage.z=NormalsAdd(normalsAverage.z,normals[((xTotal-1)*2*(yTotal-2)+2*(i-1))*3*3+14]);
p++;
}
normalsAverage.x=NormalsAverage(normalsAverage.x,p);
normalsAverage.y= NormalsAverage(normalsAverage.y,p);
normalsAverage.z=NormalsAverage(normalsAverage.z,p);
pointNormal[i][j].x=(double)normalsAverage.x;
pointNormal[i][j].y=(double)normalsAverage.y;
pointNormal[i][j].z=(double)normalsAverage.z;
normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+6]= normalsAverage.x;
normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+7]=normalsAverage.y;
normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+8]=normalsAverage.z;
normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+15]= normalsAverage.x;
normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+16]=normalsAverage.y;
normals[((xTotal-1)*2*(yTotal-2)+2*i)*3*3+17]=normalsAverage.z;
if(i!=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -