⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clothsim.java

📁 实现Java 3D环境下基于质点-弹簧模型的柔体模拟
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
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 + -