📄 clothsim.java
字号:
pointNormal=new Vector3d[xTotal][yTotal];
for(int i=0;i<xTotal;i++)
for(int j=0;j<yTotal;j++)
{
vector3dV[i][j]=new Vector3d(0.0,0.0,0.0);
vectorF[i][j]=new Vector3d(0.0,0.0,0.0);
vectorABack[i][j]=new Vector3d(0.0,0.0,0.0);
vectorVBack[i][j]=new Vector3d(0.0,0.0,0.0);
pointNormal[i][j]=new Vector3d(0.0f,0.0f,0.0f);
}
for(int i=0;i<xTotal;i++)
for(int j=0;j<yTotal;j++)
{pointPosition[i][j]=new Point3d();
pointPosition[i][j].x=0.015+xyDistance*i;
pointPosition[i][j].y=0.33+xyDistance*j;
pointPosition[i][j].z=0.0;
pointPositionBack[i][j]=new Point3d();
pointPositionBack[i][j].x=0.0;
pointPositionBack[i][j].y=0.0;
pointPositionBack[i][j].z=0.0;
}
}
//创建面质点球模型
public Sphere clothSimSphere()
{
Appearance app = new Appearance();
Material material = new Material();
material.setEmissiveColor(new Color3f(0.0f,1.0f,0.0f));
app.setMaterial(material);
Sphere sphere=new Sphere(0.01f,app);
return sphere;
}
// 利用sharegroup类创建质点球模型阵列
public Group ClothSimArray()
{
Group group=new Group();
SharedGroup shared=new SharedGroup();
shared.addChild(clothSimSphere());
pointTransformGroup=new TransformGroup[xTotal][yTotal];
pointTransform3D=new Transform3D[xTotal][yTotal];
for(int i=0;i<xTotal;i++)
for(int j=0;j<yTotal;j++)
{
pointTransform3D[i][j]=new Transform3D();
pointTransform3D[i][j].setTranslation(
new Vector3d(pointPosition[i][j].x, pointPosition[i][j].y,
pointPosition[i][j].z));
pointTransformGroup[i][j]=new TransformGroup(pointTransform3D[i][j]);
pointTransformGroup[i][j].setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
pointTransformGroup[i][j].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
pointTransformGroup[i][j].addChild(new Link(shared));
group.addChild(pointTransformGroup[i][j]);
}
return group;
}
//刷新质点球模型位置
public void UpdataerLineArray()
{
for(int i=0;i<xTotal;i++)
for(int j=0;j<yTotal;j++)
{
pointTransform3D[i][j].setTranslation(new Vector3d(pointPosition[i][j].x,
pointPosition[i][j].y, pointPosition[i][j].z));
pointTransformGroup[i][j].setTransform( pointTransform3D[i][j] );
} }
//根据质点位置的变化,刷新Transform3D局部坐标系
/////////////////////////////////////////////////////////////
// clothSim线模型内部类 //
// //
// 创建ClothSim面模型,创建一个ClothSimUpdater更新对象 //
// //
// //
/////////////////////////////////////////////////////////////
public class ClothSimLine extends BranchGroup
{
//ClothSimLIne构造函数
public ClothSimLine()
{
Appearance clothSimAppear;
clothSimAppear = createClothSimAppearance();
this.addChild(new Shape3D(createClothSimGeometry(),createClothSimAppearance()));
//调用createClothSimGeometry(),createClothSimAppearance()创建并添加线模型BranchGroup节点
geometryLineUpdater = new ClothSimLineUpdater();//创建线模型更新对象
}
//构建ClothSimLine线阵列实体
Geometry createClothSimGeometry(){
int N = (xTotal-1)*yTotal+xTotal*(yTotal-1)+(xTotal-1)*(yTotal-1)*2; // 线条总数
clothSimLines = new LineArray(N*2,
LineArray.COORDINATES | LineArray.BY_REFERENCE);
//创建ClothSim模型线阵列
clothSimLines.setCapability(GeometryArray.ALLOW_REF_DATA_READ);
clothSimLines.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
clothSimLines.setCapability(GeometryArray.ALLOW_COUNT_READ);
//设置clothSimLine的能力
float[] coordinates = new float[N*3*2]; //创建ClothSimLine顶点坐标数组
int p;
int i=0;
int j=0;
for(p = 0; p < 2*((xTotal-1)*yTotal) ;p+=2)
{
coordinates[p*3+0] = (float)pointPosition[i][j].x;
coordinates[p*3+1] = (float)pointPosition[i][j].y;
coordinates[p*3+2] =(float) pointPosition[i][j].z;
coordinates[p*3+3] = (float)pointPosition[i+1][j].x;
coordinates[p*3+4] = (float)pointPosition[i+1][j].y;
coordinates[p*3+5] = (float)pointPosition[i+1][j].z;
i++;
if(i==(xTotal-1))
{i=0;
j++;}
}
j=0;
i=0;
for(p = 2*(xTotal-1)*yTotal; p < 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)); p+=2){
coordinates[p*3+0] = (float)pointPosition[i][j].x;
coordinates[p*3+1] = (float)pointPosition[i][j].y;
coordinates[p*3+2] =(float) pointPosition[i][j].z;
coordinates[p*3+3] = (float)pointPosition[i][j+1].x;
coordinates[p*3+4] = (float)pointPosition[i][j+1].y;
coordinates[p*3+5] = (float)pointPosition[i][j+1].z;
j++;
if(j==(yTotal-1))
{j=0;
i++;}}
i=1;
j=0;
for(p = 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)); p < 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)+(xTotal-2)*2*(yTotal-1)); p+=4)
{
coordinates[p*3+0] = (float)pointPosition[i][j].x;
coordinates[p*3+1] = (float)pointPosition[i][j].y;
coordinates[p*3+2] =(float) pointPosition[i][j].z;
coordinates[p*3+3] = (float)pointPosition[i-1][j+1].x;
coordinates[p*3+4] = (float)pointPosition[i-1][j+1].y;
coordinates[p*3+5] = (float)pointPosition[i-1][j+1].z;
coordinates[p*3+6] = (float)pointPosition[i][j].x;
coordinates[p*3+7] = (float)pointPosition[i][j].y;
coordinates[p*3+8] =(float) pointPosition[i][j].z;
coordinates[p*3+9] = (float)pointPosition[i+1][j+1].x;
coordinates[p*3+10] = (float)pointPosition[i+1][j+1].y;
coordinates[p*3+11] = (float)pointPosition[i+1][j+1].z;
i++;
if(i==(xTotal-1))
{i=1;
j++;}}
i=0;
j=0;
for(p = 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)+(xTotal-2)*2*(yTotal-1)); p < 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)+(xTotal-1)*2*(yTotal-1)); p+=4)
{
coordinates[p*3+0] = (float)pointPosition[i+(xTotal-1)][j].x;
coordinates[p*3+1] = (float)pointPosition[i+(xTotal-1)][j].y;
coordinates[p*3+2] =(float) pointPosition[i+(xTotal-1)][j].z;
coordinates[p*3+3] = (float)pointPosition[i+(xTotal-1)-1][j+1].x;
coordinates[p*3+4] = (float)pointPosition[i+(xTotal-1)-1][j+1].y;
coordinates[p*3+5] = (float)pointPosition[i+(xTotal-1)-1][j+1].z;
coordinates[p*3+6] = (float)pointPosition[i][j].x;
coordinates[p*3+7] = (float)pointPosition[i][j].y;
coordinates[p*3+8] =(float) pointPosition[i][j].z;
coordinates[p*3+9] = (float)pointPosition[i+1][j+1].x;
coordinates[p*3+10] = (float)pointPosition[i+1][j+1].y;
coordinates[p*3+11] = (float)pointPosition[i+1][j+1].z;
j++;
}
//利用质点原始位置坐标初始ClothSimLine的顶点坐标数组
clothSimLines.setCoordRefFloat(coordinates);//将顶点数组添加到clothSimLines对象
return clothSimLines;
}
//构建ClothSimLine外观
Appearance createClothSimAppearance()
{
Appearance appear = new Appearance();
Material material = new Material();
appear.setMaterial(material);
return appear;
}
}
/////////////////////////////////////////////////////////////
// clothSimUpdate线模型更新内部类 //
// //
// 更新面模型的质点顶点坐标数组,顶点法向量数组 //
// //
// //
/////////////////////////////////////////////////////////////
public class ClothSimLineUpdater implements GeometryUpdater
{
GeometryArray geometryArray;//更新对象
float[] vertices;//顶点数组
int N;//顶点总数
//ClothSimUpdater构造函数
public ClothSimLineUpdater()
{
}
//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 < 2*(xTotal-1)*yTotal; p+=2)
{
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;
i++;
if(i==(xTotal-1))
{i=0;
j++;}}
i=0;
j=0;
for(p = 2*(xTotal-1)*yTotal; p < 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)); p+=2)
{
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][j+1].x;
vertices[p*3+4] = (float)pointPosition[i][j+1].y;
vertices[p*3+5] = (float)pointPosition[i][j+1].z;
j++;
if(j==(yTotal-1))
{j=0;
i++;}}
i=1;
j=0;
for(p = 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)); p < 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)+(xTotal-1)*2*(yTotal-1)-(yTotal-1)*2); p+=4)
{
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+1].x;
vertices[p*3+4] = (float)pointPosition[i-1][j+1].y;
vertices[p*3+5] = (float)pointPosition[i-1][j+1].z;
vertices[p*3+6] = (float)pointPosition[i][j].x;
vertices[p*3+7] = (float)pointPosition[i][j].y;
vertices[p*3+8] =(float) pointPosition[i][j].z;
vertices[p*3+9] = (float)pointPosition[i+1][j+1].x;
vertices[p*3+10] = (float)pointPosition[i+1][j+1].y;
vertices[p*3+11] = (float)pointPosition[i+1][j+1].z;
i++;
if(i==(xTotal-1))
{i=1;
j++;}}
i=0;
j=0;
for(p = 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)+(xTotal-1)*2*(yTotal-1)-(yTotal-1)*2); p < 2*((xTotal-1)*yTotal+xTotal*(yTotal-1)+(xTotal-1)*2*(yTotal-1)); p+=4)
{
vertices[p*3+0] = (float)pointPosition[i+(xTotal-1)][j].x;
vertices[p*3+1] = (float)pointPosition[i+(xTotal-1)][j].y;
vertices[p*3+2] =(float) pointPosition[i+(xTotal-1)][j].z;
vertices[p*3+3] = (float)pointPosition[i+(xTotal-1)-1][j+1].x;
vertices[p*3+4] = (float)pointPosition[i+(xTotal-1)-1][j+1].y;
vertices[p*3+5] = (float)pointPosition[i+(xTotal-1)-1][j+1].z;
vertices[p*3+6] = (float)pointPosition[i][j].x;
vertices[p*3+7] = (float)pointPosition[i][j].y;
vertices[p*3+8] =(float) pointPosition[i][j].z;
vertices[p*3+9] = (float)pointPosition[i+1][j+1].x;
vertices[p*3+10] = (float)pointPosition[i+1][j+1].y;
vertices[p*3+11] = (float)pointPosition[i+1][j+1].z;
j++;
}//更新ClothSimLine的顶点坐标数组
}
}
/////////////////////////////////////////////////////////////
// clothSim面模型内部类 //
// //
// 创建ClothSim面模型,创建一个ClothSimUpdater对象 //
// //
// //
/////////////////////////////////////////////////////////////
//创建ClothSim面模型内部类
public class ClothSimFace extends BranchGroup{
//ClothSimFace构造函数
public ClothSimFace()
{
Appearance clothSimAppear;
clothSimAppear = createClothSimAppearance();
this.addChild(new Shape3D(createClothSimGeometry(),createClothSimAppearance()));
//调用createClothSimGeometry(),createClothSimAppearance()创建并添加三角面BranchGroup节点
geometryUpdater = new ClothSimUpdater();
//创建ClothSimFace更新对象
}
//构建ClothSimFace三角面阵列实体
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -