개발 · 컴퓨터공학/three.js / / 2024. 7. 21. 09:00

Threejs Cloth Tailor 개발일지 - 잘린 부분 시뮬레이션 이슈, cloth 객체 face update, simulation start 마다 constraint가 추가로 push되어 연산량 대폭 증가

728x90
반응형

 

이슈. 잘린 부분이 시뮬레이션에 반영되지 않음

mesh 분리 작업을 하는 과정에서 어느 순간부터인지 이렇게 잘리면, 

아래 부분은 힘을 잃고 일부 떨어져야하는데, 마치 하나인 양 움직인다.

 

온전히 mesh가 분리되지 않으면 생기는 현상이다. 왜 이러지? 

이 부분은 remove vertex에서도 remove edge에서도 발생한다. 

 

이외에도 치명적인 이슈가 하나 더 있는데, 우선 이 문제부터 해결하자.

 

원인 분석

일단 mesh separate로 인해서 생기는 현상은 아닐 것이다. 

분리되지않으면 mesh에 대해 특별히 처리하지 않으므로.

 

따라서 raycast나 vertex remover에서 있을 것이다. 

 

아.. 찾은 것 같다. 

영향을 미친 부분은 아마 이 함수이다. 

simlation start할 때 기존에는 항상 new cloth 객체를 생성해서 제거된 face가 즉각 반영되었지만

현재는 mesh가 분리되는 경우에만 새로운 cloth 객체를 생성하기 때문에 발생한 것 같다.

 

이제는 cloth 객체에서 face 정보를 update하는 것을 생성으로 퉁치면 안되겠다. 

즉 현재 필요한 것은 cloth객체의 face 정보 update 기능이다. 

cloth 객체 face update

생성자에서 하는 역할 중 update에 사용될 로직들을 따로 정리해서 updateMesh 함수를 cloth 객체에 생성해보자. 

 

이 생성자에서 하는 역할을 해야하고, constraint의 경우는 simulation start에서 처리하니까 update mesh기능만 구현해보자.

 

  protected updateMeshes(){
    this.invMass = this.initInvMass();
    this.neighbors = this.findTriNeighbors();
  }

physics object 안에 update meshes를 만들었다.

 

실행하는 두 함수는 private 함수이기 때문에 cloth 객체에서는 접근성할 수 없어서.

저렇게 별도의 함수를 만들어서 호출한 것. 

 

이렇게 simulation start 부분에 update되지 못한 mesh를 처리해주면 될 것 같다. 

실행해보자.

어라.?

update Mesh를 하니 시뮬레이션이 아예 안되게 되었다. 

아 이제보니 이 함수를 실행하지 않고 있었다. 

중력이 없으니 당연히 움직이지 않지.

이름은 애매하니까 바꾸자 

 

  public updateMesh(mesh: Mesh){
    this.numParticles = mesh.geometry.attributes.position.count;
    this.positions = new Float32Array(mesh.geometry.attributes.position.array);
    this.normals = new Float32Array(mesh.geometry.attributes.normal.array);
    this.prevPositions = new Float32Array(mesh.geometry.attributes.position.array);
    this.vels = new Float32Array(3 * this.numParticles);
    this.invMass = new Float32Array(this.numParticles);
    this.indices = new Uint16Array(mesh.geometry.index?.array ?? new Array(0));
    this.constraints = [];
    this.collisions = [];

    this.updatePhysics();

    console.log(`new constraint factory`)
    this.constraintFactory = new ConstraintFactory(
      this.positions,
      this.invMass,
      this.indices,
      this.neighbors
    );
    
    this.mesh = mesh
  }

 

그래 이제 시뮬레이션은 된다.

udpate를 start에 하였고, 이때는 vertex fix를 하지 않아서 옷이 그냥 떨어진다. 

이러면 잘랐을 때 확인하기 힘든데 vertex fix를 실행하고 다시 보자. 

 

잘린 부분이 떨어지며 따로 벌어지는 현상이 잘 생긴다. 

 

의외의 이슈 해결 : simulation start 마다 constraint가 추가로 push되어 연산량 대폭 증가

생각해보니 udpate Mesh 함수를 통해서 constraints를 초기화한다.

언급은 하지 않았지만 simulation을 start / stop 할 때마다 constraints가 계속 추가되어서 연산량이 너무 많아 시뮬레이션 속도가 확 느려졌던 현상이 있었는데. 얼떨결에 해결되었다. 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유