본인은 프로그래머이고,
물리학은 고등학교 때까지 배운게 다입니다.
언리얼 엔진으로 바람에 움직이는 잔디 한번 구현해 보려고 하는데...
고스트 오브 쓰시마라는 게임 개발자들이 발표한거 따라해서 Bezier 커브로 구현된 잔디 모델 만듬.
근데 이 개발자들이 자기들 게임에서 잔디가 어떤방식으로 바람에 반응해서 움직이는지 자세히 설명 안함.
그래서 그냥 대충 위아래로만 움직이게 sine wave 같은거 때려 박을까 아니면 다른 방법 없나 찾아보니까,
Bezier 커브로 모델링된 잔디에 rotational dynamic을 적용해서 잔디의 움직임을 구현한 그럴듯한 논문이 있었음.
이 논문에서는 위 아래로만 움직이는게 아니라 옆으로 회전도 하고, 트위스트도 하는 식이고 나름 물리학적인 배경도 설명함.
A simulation on grass swaying with dynamic wind force | The Visual Computer
위에 들어가면 영상도 볼 수 있음.
논문도 대충 읽어보니 꽤나 그럴듯해서 작업 시작하려고 했는데...
안에 사용된 수학 공식에 에러가 있음.
잔디는 대충 위와 같은 방식. Ew, En은 길이 1의 유닛 벡터임. Ee는 잔디를 컨트롤 하는 베지어 커브의 엣지 길이.
바람으로 인한 포스 벡터
바람 velocity v 벡터를 Ew에 프로젝션 하고, 잔디 엣지의 면적 S를 곱하고 특정 계수를 곱함.
잔디가 되돌아가려는 포스 벡터
잔디의 강도 k, 잔디가 회전한 앵글, 실제 잔디 엣지의 끝부분 포인트 (위 이미지의 Pi+1)이 원래 포지션에서 얼마나 이동했는가에 대한 벡터를 곱함.
댐핑 포스 벡터 (여기서 부터 에러가 있음.)
그래서 angular velocity랑 angular displacement는 다음과 같음.
F는 잔디에 적용되는 전체 포스.
잔디에 적용되는 포스와 잔디 엣지 벡터의 크로스 프로덕트를 구해서 토크를 구한다.
그래서 앵글 가속을 구하고, 대략적인 앵글 속도를 수치해석으로 구하고 수치해석으로 앵글 변화를 구함.
근데 떼이타는 앵글 값임.
이건 scalar여야함. 벡터가 아님.
w도 앵글 속도이니까 스켈라 값이어야하는데 벡터로 표기되어있음.
위의 D도 뭔가 잘못된것.
그냥 물리학 부분은 대충 스킵하고 수치해석적으로 어떻게 계산해야하는지만 파악해서 적용하려고 했는데...
논문 저자가 뭔가를 잘못했다는 것을 깨닫고,
아침부터 토크란 무엇이고, 애초에 이런 시스템을 뭐라고하고, 댐핑 포스?는 어떻게 구해야하는지 인터넷 뒤져가고 gpt에게 물어보면서 공부함.
그러다 이런식의 시스템을 rotational dynamic이라고 부르는 것을 알게 되었고,
아니 뭘 어떻게 고쳐야하는지 공부했다.
그렇게 해서 정리한 수정해야할 사항들.
일단 위의 F= W + R + D는 잘못되었음. 그냥 빼야함.
D는 댐핑 포스가 아니고, 댐핑 토크 라고 해야하는게 맞는 것 같음.
그외에 필요한 수정사항.
w는 회전 속도라서 vector값 아니고 scalar임.
그래서 D도 scalar임.
N = net torque이다.
엣지의 끝부분에 적용되는 W + R 포스와 엣지 벡터의 크로스 프로덕트를 구하고, 그 벡터의 길이를 구해서 바람과 잔디가 되돌아가려는 힘으로 인한 토크를 구하고,
그 토크에 댐핑 토크로 인한 토크를더해서 N을 구해야한다.
그래서 N은 스켈라이고, 벡터가 아님.
N 토크에 I를 나누면 앵글 가속도를 구하고,
그걸로 앵글 속도를 수치해석적으로 구하고,
전체 앵글 변화를 구해야함.
위의 세번째 줄 내가 맞게 고친거 맞지?
물리학 잘하는 형들 좀 알려줘.
ㅠㅠ
이것 때문에 챗 지피티한테 물어보면서 물리 공부하고 하루종일 고생했다.
일단 저자한테 메일도 보내둠.
WoW1234
각속도 각변위가 왜 스칼라임 벡터지
논문에서는 일정한 벡터를 axis로 해서 그걸 기준으로 각속도, 각변위는 스칼라인 식으로 공식을 썼음. 위에서 각변위가 떼이타이고, 각속도가 w임. 5번 공식을 보면 각변위에 s 벡터를 곱하고 있음. s랑 각변위 둘다 벡터면 5번 공식이 이상해짐.
중간까지 읽었는데 댐핑포스의 도입부터 이상하긴 하네 진동은 복원력 때문에 생기는거고, 댐핑은 진동을 줄여 정적 상태로 만드는 힘인데 논문에서는 진동을 만들기 위해 댐핑포스를 도입한다고 썼네
근데 그냥 (5) 식에서의 세타에만 절대값을 씌우면 그 뒤부터는 각변위 각속도 전부 벡터로 보면 문제 없는거같은데
아 그럼 D 방향을 조정해야 하네 이래저래 오류인건 맞음
내생각엔 D=-c*v=-c*E_e*ω 로 해서 그냥 힘에 넣는게 편할거같음 v=rω니까
아. D를 힘에 넣을 수도 있겠군요. 어찌보면 더 편할것 같기는 하네요. 감사합니다.
근데 오른손 룰 적용해가면서 실제로 그려보니까 D=-cw x E_e 인것 같음. (c는 양 수 일경우), 이 순서여야 E_e x D의 방향이 w랑 반대가 됨.
인터넷 비교가입 사이트 조금만 알아봐도 사은품 꽤받던데ㅋㅋ 난 여기서 47만원 받고 갈아탐ㅇㅇ https://bestplus.kr/internet
음... 님 진동 공부하고 오실? 댐핑 포스가 뭔지를 아셔야 할 듯. 대학물리책 진동파트 후반부 가면 자세히 적혀있음. 그리고 토크는 벡터가 맞음. 정확히는 유사벡터인데, 계산 자체는 토크끼리 연산하는 게 없다면 스칼라 취급해도 상관은 없긴함.
나도 하나하나 계산하는 건 다 까먹었으니 간략하게만 얘기하면, 이건 잔디의 움직임을 감쇠(댐핑)가 있는 진동으로 취급해서 문제를 다뤄보겠다는 내용임. 여기서 감쇠는 잔디가 끊어지지 않는다는 전제하에, 그 복원력을 감쇠력으로 보겠다는 소리임.
ㅈㅅ 잘못썼네. 바람이 감쇠력임. 잔디의 회복탄성력이 복원력이고. 미안미안. 그래서 님이 검색해서 공부할 내용은, 감쇠가 있는 진동을 찾아서 공부하시면 됩니다. 감쇠는 보통 속도에 비례하는 형태라서 이 논문과 잘 맞을듯?
그리고 이런 문제는 각도 움직임이 매우 작아서 근사로 처리한 게 많을 거임. 그럼 식이 좀 더 간단해지거든? 그것도 잘 찾아보셈.