attach id list 전달하기
attach id list를 attach_vertex mode에서 전달할 수 있게 만들고 나서 테스트를 하는데 안된다.
이유를 디버깅 해보다가 이제서야 깨달았는데, 사용자가 선택한 두 개의 vertex는 위 코드에서 원래 edgeIds에 짝지어진 리스트에 id0 id1로 들어있을리가 없잖아.
없는 edge를 만들어서 서로 끌어당기게 하는것인데 원래 있는 edge list에서 찾아서 constraint 적용을 한다는 개념이 잘못되었다... 어떻게 하면 좋을까.
여기서 attachIdList를 가지고 id0, id1 를 찾는게 아니라 새로운 edge를 만들어야한다.
attachIdList로 new edge 정보 만들기
흠.. 그렇다고 initializeEdgeLengths 함수에서 바로 edgeLenghts에 넣는다고 되지는 않을 것 같은데?
아! mesh attacher에서 edge를 만들어주면 생기겠구나..
vertex index 1와 vertex index 2를 연결하는 새로운 edge로 index를 넣었다.
이러면 constraint가 생기긴 하는데, 사실상 edge를 넣는게 아니라 face를 넣는 개념이기 때문에
index에 2개만 추가한다면 여러 개 추가할 때 오류가 생긴다.
그래서 vertex index 2를 하나 더 넣어 3개를 맞춰주었다.
같은 인덱스가 하나 더 들어가서 face를 구성하면 문제 없을거라고 생각했는데
두 vertex가 잘 attach 되는 경우가 있다가도,
간헐적으로 attach를 하면 mesh 자체가 사라져버리는 이슈가 발생했다.
즉 face 하나에 중복되는 index가 들어가면 geometry에 set index를 하였을 때 내부적으로 오류가 생겨서
전체 face 자체를 생성하지 못하는 경우가 발생한다고 생각된다.
set index
테스트를 하면서 의문이 든 것은 set index가 face에 중복으로 들어가는 vertex index를 처리해준다면?
그러면 전반적으로 없어지는 것이 이해가 된다.
실제로 이렇게 임의로 face의 세 index를 다르게 설정해주면,
이전처럼 face가 전부 사라지는 현상은 생기지 않는다.
생각을 좀 해봤는데, face를 만들어서 index를 건드리지 않고 constraint에서 특정 edge만 추가해주면 좋을 것 같긴 하다.
그러면 constraint에서 edge를 따로 추가하는 방법을 알아야한다.
constraint edge 추가하기
getEdgeids에 triangle 수만큼 edge id를 넣어준다.
triangle에 대한 반복문이 끝나면 마지막에 추가 edge들을 넣어주는 방식이 좋을 것 같다.
이렇게 attach id list를 edgeIds에 추가한다. 현재 geometry index는 반영하지 않은 상태이다.
추가한 edgeIds가 자동으로 edgeLengths가 되므로
initializeEdgeLengths에서의 attach vertex 방식은 유지해보자.
distance constraint edge 추가 테스트
그리고 이렇게 분리되지 않을 만큼 지워진 mesh에서 테스트해보면
찰싹 하고 잘 달라붙는 걸 볼 수 있다.
방법은 성공했고, 실제로 distance constraint에서 시뮬레이션 상의 가상의 edge만 추가한 것이기 때문에 face에는 영향을 미치지 않는다.