이슈. 잘린 부분이 시뮬레이션에 반영되지 않음
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가 계속 추가되어서 연산량이 너무 많아 시뮬레이션 속도가 확 느려졌던 현상이 있었는데. 얼떨결에 해결되었다.