corn 모양 변경
Joint의 가동 범위를 지금까지 타원기반의 corn 모양으로 사용했었다. 하지만 x축 각도가 Max 혹은 Min 값으로 갈수록 경우 z축의 범위가 너무 좁아지기 때문에 부자연스러울 수 있다 생각하여 사각뿔로 바꾸었다.
(혹시 Jacobian이 수렴하지 못한 이유가 이것일 수 있기 때문에 바꾼 것도 있음)
기존 corn 모양의 가동 범위
새로운 사각뿔 모양의 가동 범위
Jacobian 수렴 못하던 이유 분석
지난주 마지막에 clamping에 성공했는데도 불구하고 Target에 수렴하지 못한 것을 발견하였다. 그래서 이번엔 그 원인을 먼저 찾기 위해 디버깅을 진행하였다.
1. Jacobian 자체가 수렴하지 못 하는가?
우선 가장 기본적인 Jacobian의 기능을 확인해보았다. 기존엔 target 위치의 시각화를 안했고 endeffector가 땅에 붙어있는 것만 확인했기 때문에 제대로 Target에 수렴하는지까지는 확인을 하지 못했었다. 이번엔 target을 시각화하였고, clamping 기능을 제거한 후 다시 한 번 확인해보았다.
다음과 같이 Jacobian 자체는 clamping이 없으면 문제없이 잘 수렴하고 있었다는 것을 확인할 수 있다.
2. Clamping이 문제인가?
이번엔 Clamping을 켜놓고 Iteration을 늘려보며 문제를 확인해보았다.
case - iteration = 1
첫 IK 반복시 사진이다. 수렴이 자연스럽게 될 수 있도록 허벅지를 최대한 들어올리고 종아리를 최대한 접은 상태로 시작하게 만들었다. 여기서부터 수렴이 서서히 들어가는 것이다. (참고로 바닥의 빨간점이 Target 위치)
case - iteration = 2
두번째 IK 반복시 사진이다. 여기서 이상한 점을 발견할 수 있는데 기존 종아리의 위치에서 너무 급격하게 반대로 꺾인것을 확인할 수 있다. 분명 처음 사진을 보면 종아리가 반대쪽으로 꺾여야하는 것은 맞지만 Jacobian의 특성상 조금씩 움직여 수렴하기 때문에 저렇게 크게 움직이는 것은 오류라 볼 수 있고, 실제로 두번째 반복의 clamping 전 위치를 확인해 본 결과 twist-swing 분해 후 twist각도 clamping에서 문제가 발생했다는 것을 확인하였다.
기존 Clamping과정은 다음과 같이 진행됐었다.
1. Quaternion을 Twist와 Swing으로 분해
2. Twist 각도 Clamping
3. Swing을 X축, Z축 회전으로 분리
4. Swing의 Y축 회전 조정
문제가 발생하는 부분은 2번과 4번의 관계이다.
4번에서 Swing에 Y축 회전을 추가해서, 다음 반복시 Twist의 각도는 기존에 의도한 clamping 각도의 범위를 벗어나게 되고, 이를 clamping하여 4번의 Y축 회전을 없애버리면 Quaternion 회전이 기존 회전과 다른 것이 되어버리는 것이다.
결국 4번 자체가 또 하나의 Twist Clamping이었고, 한 번의 Clamping 과정에서 2가지 기준으로 Y축 Clamping을 2번하고 있었던 것이 문제였다. 따라서 2번의 Twist Calmping을 제거하니 잘 수렴하는 것을 볼 수 있었다.
다음은 Clamping을 적용한 IK가 잘 수렴하는 모습이다. (땅에 빨간점이 따로 떨어진 것이 보이지 않으면 잘 수렴하고 있는 것)
지면에 발 각도 맞추기
이제 IK 수렴을 완료하였으니 지면의 Normal 벡터에 맞게 발각도를 맞추는 것이 필요하다. 우선은 발 전체가 지면에 닿는다는 가정하에 발목의 각도만 조절하였다. 발목의 각도를 지면의 Normal 벡터로 맞추기 위해 우선 Normal 벡터를 World 좌표계에서 발목의 Local 좌표계로 변환하였다. world 좌표계에서 (0, 1, 0)인 Normal 벡터를 N이라하고 그때 지면에 맞는 발목의 각도를 q라하면, 다른 Normal 벡터 N'이 들어온 경우 N과 N'의 차이만큼 발목의 각도를 q'으로 변화시켜주었다. 이때 각도는 x축과 z축으로 분리하여 clamping 각도로 넣어주었다. (y축은 알아서 clamping됨)
다음은 많이 완만한 경사에서의 영상이다.
이번엔 경사가 있는 동그란 지면에서의 영상이다.
IK와 animation blending 대신 하체는 only IK로 적용
이제 IK 적용을 완료했으니 실제 걷는 애니메이션을 만들어볼 예정이다. 기존 계획은 animation을 활용하는 방법으로, IK와 animation을 적절히 블렌딩하여 구현하려 했으나, 경사가 어느정도 있는 경우 y값 차이로 인해 지면을 파고들 수 있다는 문제점이 발생할 수 있기에 다른 방법을 사용하기로 하였다.
생각을 해본 결과, 지면을 파고드는 문제를 확실하게 방지하기 위해 하체를 100% IK를 통해 통제하기로 결정하였다. 다음 발의 위치를 계산하고, 현재 발의 위치와 다음 발의 위치를 토대로 그 궤적을 계산하여 target을 만드는 방법으로 걷는 animation을 직접 만들 생각이다. (상체는 기존 animation 사용)
상태 전환 재설정
기본적으로 animation은 Idle과 Walk만 쓰지만, 다음 발 위치를 결정하거나 world Position의 변화를 줄때의 방법이 다르기 때문에 상태를 더 세세하게 나누었다.
[ Idle ] = IDLE
[ Idle -> Walk ] = START
[ Walk ] = RIGHT GO, LEFT GO
[ Walk -> Idle ] = RIGHT STOP, LEFT STOP
상태 전환을 보면 다음과 같다.
IDLE - 가만히 서있는 상태 ( 애니메이션 - Idle )
START - IDLE에서 왼발을 내딛어 출발하는 상태 ( 애니메이션 - Idle -> Walk )
RIGHT GO - 오른발을 앞으로 움직여 걷는 상태 ( 애니메이션 - Walk )
LEFT GO - 왼발을 앞으로 움직여 걷는 상태 ( 애니메이션 - Walk )
여기서 굳이 LEFT GO를 바로 하지 않고 START를 넣은 이유는 Idle과 Walk의 발위치가 다르기 때문에 기존 LEFT GO와 같이 처리를 한다면 다시 Idle로 돌아가는 경우 위치가 변할 수 있기 때문이다. (Idle 상태의 양발의 너비가 더 넓음)
위와 같은 이유로 START가 필요한 것처럼 다시 IDLE로 돌아갈때는 STOP이 필요하다.
RIGHT STOP - 오른발을 IDLE의 발상태 기준으로 앞으로 내딛는 상태 ( 애니메이션 - Walk -> Idle )
LEFT STOP - 왼발을 IDLE 오른발에 맞춰 IDLE 왼발 위치로 내딛는 상태 ( 애니메이션 - Walk -> Idle)
LEFT STOP 까지 마치면 자연스럽게 발위치가 IDLE 상태가 된다.
이를 구현하기 위해 아래와 같이 발위치 설정과 몸 위치 설정을 진행하였다.
상태에 맞는 발위치 설정
다음 발을 내딛을 곳은 상태마다 다르게 설정된다.
현재 애니메이션이 Walk인 경우 (Idle -> Walk 혹은 Walk)
- 왼발이 앞으로 나가는 경우 0.25f 기준으로 오른발로 부터 왼발의 offset을 이용해 다음 step을 계산한다.
- 오른발이 앞으로 나가는 경우 0.75f 기준으로 왼발로 부터 오른발의 offset을 이용해 다음 step을 계산한다.
현재 애니메이션이 Idle인 경우 (Walk -> Idle)
- 오른발이 앞으로 나가는 경우 왼발 기준 엉덩이 부분에서 Idle 상태의 오른발 위치로 다음 step을 계산한다.
- 왼발이 앞으로 나가는 경우 오른발 기준 엉덩이 부분에서 Idle 상태의 왼발 위치로 다음 step을 계산한다.
위 영상은 실제 몸은 움직이지 않고 Step의 움직임을 보여주는 영상이다.
사실 이 영상은 phase가 살짝 뒤틀려있어서 타이밍이 잘 안 맞는 느낌이 있지만 이런식으로 진행된다는 것을 보여주기 좋은 것 같아 첨부하였다. (전부 구현하기 전 영상)
발위치에 맞는 몸 위치 설정
발을 움직였으니 이제 몸의 위치를 설정을 해야한다. 몸의 위치는 현재 왼발, 오른발 기준으로 엉덩이의 위치를 계산한 후 그 평균 값으로 설정하였다. 만약 걷는 중이라면 LEFT GO인 경우 LEFT GO가 끝났을때의 엉덩이 위치와 LEFT GO가 시작할때의 엉덩이 위치를 walkPhase를 이용해 보간하여 처리하였다. x, y, z 방향을 전부 고려하기 때문에 나중에 경사를 오를때도 자연스럽게 몸의 위치도 똑같이 올라가는 처리가 될 것이다.
아직은 발궤적이 없고 지면의 수직방향으로 발목을 강제 clamping하기 때문에 target으로 수렴을 하지 못하는 경우가 발생한다. 그 경우가 영상에서 발이 날라다니는 경우이고 이것이 수렴을 하지 못하는 경우 발생하는 현상이다.
그리고 walk 진행 도중 방향을 틀면 어색한 방향전환이 나오기도 하는데 이는 이전 진행 발의 상대위치를 회전을 고려하지 않고 사용하기 때문이다. 이는 차차 수정할 것이다.
이제 자연스럽게 걷는 애니메이션을 만들기 위해 다음 과정이 남아있다.
1. 회전을 고려한 이전 발 위치 저장
2. 발 궤적 설정
3. 자연스러운 발목 움직임
4. 오른발 Chain 설정
위 과정을 통해 최대한 다음주 안에 마무리하는 것이 목표이다.
Hiking: 6주차 Foot IK를 적용한 이동 구현 (0) | 2025.05.09 |
---|---|
Hiking: 4주차 Joint Clamping 적용 (0) | 2025.04.25 |
Hiking: 3주차 Jacobian IK 적용 (1) | 2025.04.18 |
Hiking: 2주차 IK 구현을 위한 준비 (0) | 2025.04.11 |
Hiking: Procedural Animation을 활용한 등산 시뮬레이션 프로젝트 (0) | 2025.04.03 |