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

📄 clothsim.java

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