오늘은 2차월 탄성 충돌 계산식을 코드로 표현해 보겠습니다~~^^*
그 전에 복습 삼아, 어제 공부했던, 접촉상태 재연 코드를 하나의 공간 안에 정리해 보겠습니다~^^*
let impactVector = p5.Vector.sub(other.position, this.position);
//other 위치좌표에서 this 위치 좌표를 빼서, this에서 other로 향하는 벡터를 만들어 변수 impactVector에 저장합니다.
let d = impactVector.mag();
//impactVector의 길이값은 두 물체 사이의 거리값이기도 합니다.
if (d < this.r + other.r) {
// 두 물체 사이의 거리가 두 물체의 반지름의 합보다 작다면
// 두 물체가 겹쳐진다면
let overlap = d - (this.r + other.r);
// 거리에서 두 물체의 반지름의 합을 빼서 변수 overlap에 저장합니다.
// overlap은 마이너스의 값을 갖게 되겠지요?
let dir = impactVector.copy();
//impactVector를 복사하여 변수 dir에 저장합니다.
//충격 벡터와 동일한 선상에서 두 물체가 뒷걸음치게 될 준비를 합니다.
dir.setMag(overlap * 0.5);
//겹친 부분 직경의 1/2 거리를 뒷걸음치겠습니다.
this.position.add(dir);
//물체 this가 뒷걸음치고
other.position.sub(dir);
//물체 other이 뒷걸음칩니다.
d = this.r + other.r;
impactVector.setMag(d);
// 두 물체의 반지름의 합을 거리에 다시 저장합니다.
// impactVector의 길이값은 두 물체의 거리값을 갖습니다.
// 두 물체는 이제 서로 접촉상태입니다.
음…근데요….정리를 하다보니…
dir.setMag(overlap * 0.5);
이 부분이 새롭게 마음에 걸리네요.. 1/2 overlap을 거리값으로 설정하는데…이건…부호가 없는 절대값이 아닌가….싶어서요….
그러면 overlap이 마이너스 값이라는 것이 의미가 없어지는데…
물체 this에서 other로 향하는 impactVector의 방향을 따르는 dir을 물체 this의 position 벡터에 더하면 한 발짝 앞으로 나가는 것이 아닌가????
혹시 impactVector의 방향을 잘못 알고 있나??? 싶어서, 벡터의 뺄셈을 다시 보니…뭔가 잘못 될 것 같아요….
물체 other의 위치 벡터에서 물체 this의 위치 벡터를 빼면, 물체 this의 위치 벡터에서 물체other의 위치 백터로 향하는 벡터가 생성되는 것은 맞는 것 같은데요…
문제는 위치 “좌표”가 아니라 위치 “벡터”라는 점인 것 같아요!!! 어머머!!! 이를 어쩌죠???
네!!! 정신을 가다듬어 다시 정리해 보겠습니다!!!
네….!!!! 물체 this에서 물체 other로 향하는 벡터가 생성되는 것이 아니라, 물체 this의 위치 “벡터”에서 물체 other의 위치 “벡터”로 향하는 벡터가 생성되는 것이 포인트인 것 같아요!!!
어제 저는 물체 this와 other의 위치 벡터를 단순히 물체 this와 other의 위치 좌표로 처리해서, other의 위치 좌표에서 this의 위치 좌표로 향하는 벡터를 그려보았던 것 같아요.
정리한 노트를 저와 함께 살펴봐 주시면 감사하겠습니다!!!





네~^^*
어제의 사고 오류를 찾아서 정정해 보았습니다~^^*
코드 주석 내용 교정은 오늘 오후에 다시 올리도록 할게요….지금 가봐야 해서요^^;;
오늘 공부 내용도…..오후에 제가 다시 돌아와서 올리도록 할게요~~^^*
저의 실수를 따뜻하게 이해해 주셔서 감사합니다~~^^*
오늘도 즐거운 아침 보내시고요!
햇살이 순해지는 저녁에 우리 다시 만나요~~^^*
비님이 햇님을 잠시 다독여 주셨네요~^^*
점심 맛있게 드셨어요~~^^*?
네~^^* 두 물체가 접촉 상태를 재연하도록 하는 코드의 주석 내용을 수정하였습니다~^^*
let impactVector = p5.Vector.sub(other.position, this.position);
//other 위치벡터에서 this 위치벡터를 빼서, other에서 this로 향하는 벡터를 만들어 변수 impactVector에 저장합니다.
let d = impactVector.mag();
//impactVector의 길이값은 두 물체 사이의 거리값이기도 합니다.
if (d < this.r + other.r) {
// 두 물체 사이의 거리가 두 물체의 반지름의 합보다 작다면
// 두 물체가 겹쳐진다면
let overlap = d - (this.r + other.r);
// 거리에서 두 물체의 반지름의 합을 빼서 변수 overlap에 저장합니다.
// overlap은 마이너스의 값을 갖게 되겠지요?
let dir = impactVector.copy();
//impactVector를 복사하여 변수 dir에 저장합니다.
//충격 벡터와 동일한 선상에서 두 물체가 뒷걸음치게 될 준비를 합니다.
dir.setMag(overlap * 0.5);
//겹친 부분 직경의 1/2 거리를 뒷걸음치겠습니다.
this.position.add(dir);
//물체 this가 충격벡터 방향으로 반걸음 움직이고
other.position.sub(dir);
//물체 other가 충격벡터 반대방향으로 반걸음 움직이겠습니다.
d = this.r + other.r;
impactVector.setMag(d);
// 두 물체의 반지름의 합을 거리에 다시 저장합니다.
// impactVector의 길이값은 두 물체의 거리값을 갖습니다.
// 두 물체는 이제 서로 접촉상태입니다.
네~~^^*
이젠 충돌 후의 두 물체의 속도 계산식을 코드로 표현해 보겠습니다~^^*
노트에 정리를 해 보았는데요~~ 코드의 번호를 계산식에서 찾아 하나 하나 짚어보시면, 코드 진행 순서를 이해하기가 좀더 쉬워질 것 같아요~~^^*
오늘은 계산식 표현 코드 그림을 지긋이 감상하구요~~
내일, 이것을 코드로 입력해서, 물체 클래스 정의를 완성해 보도록 할게요~~^^*
오늘은 사진 감상회~~^^*를 편안히 즐겨 주시면 감사하겠습니다~~^^*


오늘 저와 함께 충격벡터의 방향에 대한 오류도 교정하고, 충돌 후 속도 변화 계산식을 코드로 표현하는 노트작업을 함께 해 주셔서 감사합니다~~^^*
내일은 우리, 물체 클래스를 완성해서, 충돌 장면을 표현하는 프로그램을 완성해 볼까요~~^^*
오늘 충격 벡터 impactVector 방향을 저와 함께 Fix 해 주셔서 감사합니다~~^^*
실수를 발견하고 실수를 Fix하는 과정도 함께 나눌 수 있어서 참 감사합니다~~^^*
오늘 하루도 수고 많으셨어요~^^* 맛있는 저녁과 편안한 밤의 깊은 잠이 우리의 피곤한 몸을 Fix해 줄 거예요~~^^*
Relax하는 편안한 밤 보내셔요~~^^* 피로가 Fix 될 거예요~~^^*
그럼 또 우리 내일 생기발랄한 몸으로 다시 또 만나는 거죠~~^^* 그리고 함께 코드 공부 하는 거죠~~~^^*
네~~!!! 꿈은 이루어 집니다~~!!!
댓글 남기기