이 갤에 자주 들리는데 글은 자주 올라오지 않아서 슬픔 ㅠ
기차 만드는데 앞 뒤 기차끼리 거리 유지를 해주고 싶은데
며칠을 고민해봤지만 어떻게 해야할 지 막막해서 올립니다요
패스 구성은 이렇게 되어있고 저 오브젝트들 하나씩 찍으면서 다음 오브젝트로 이동함
근데 커브하고 직선에 따라 작동하는게 조금 다름..
지금 스크립트로는 기차마다 스크립트가 붙어서 패스를 따라가는데(따로 노는 상황)
현재 타일과 다음 타일을 생각해서 움직이는 거로
직선-직선/직선-커브/커브-직선or커브 이렇게 3부분으로 만들었거든여
근데 앞기차와 뒷기차의 거리가 직선에서는 일정해야 됨.
커브-직선or커브 에서는
progress += Time.deltaTime / duration;
if (progress > 1f)
{
progress = 1f;
}
if (progress < 0.05f) // 직선에서 곡선으로 넘어올 때 보정 해주기
{
distance = Vector3.Distance(bezierCurve.GetPoint(progress + 0.05f), transform.position);
transform.position = Vector3.MoveTowards(transform.position, bezierCurve.GetPoint(progress + 0.05f), Time.deltaTime * speed);
rotation = Quaternion.LookRotation(bezierCurve.GetPoint(progress + 0.05f) - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * rotationSpeed);
}
else if (progress < 1f) // Bezier Curve 돌기
{
Vector3 position = bezierCurve.GetPoint(progress);
transform.position = position;
transform.LookAt(position + bezierCurve.GetDirection(progress));
}
if (progress == 1f)
{
progress = 0f;
currentWayPointID++;
}
이렇게 progress가 주어진 duration으로 deltaTime을 나눠서 움직이고
직선에서는 코드가 deltaTime*speed로 움직이는
distance = Vector3.Distance(pathToFollow.path_objs[currentWayPointID].position, transform.position);
transform.position = Vector3.MoveTowards(transform.position, pathToFollow.path_objs[currentWayPointID].position, Time.deltaTime * speed);
rotation = Quaternion.LookRotation(pathToFollow.path_objs[currentWayPointID].position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * rotationSpeed);
if (distance <= reachDistance)
{
currentWayPointID++;
}
if (currentWayPointID >= pathToFollow.path_objs.Count)
{
currentWayPointID = 0;
}
이런 식이라서 곡선하고 직선에서의 기차 속도가 달라여...
이렇게 보면 비슷해보이는데 제가 걍 speed에 맞춰서 duration 넣어준 거임
계속 돌리다보면 직선에서는 기차끼리 거리가 점점 멀어지고 곡선에선 가까워지는데 자기 맘대로임..
기차끼리 거리 유지를 속력으로 하려고 생각해보니 직선, 곡선에서의 속도가 따로라서 어찌 해야할 지 모르겠슴....
요약 :
직선에서는 기차 거리를 유지하다가 곡선에서는 거리를 좀 더 멀리 해주고
다시 직선에 들어서면 기차 거리를 유지하고 싶은데 방법에 대한 실마리가 필요합니다.... 도움.... ㅠㅠ
Joint도 써봤는데 기차가 아예 안 움직임;;
앞 기차와 뒤 기차의 각도차이에 비례해서 멀어지면 안됨?
두 기차의 접점(앞 기차의 뒤 중앙, 뒤 기차의 앞 중앙)의 거리 = 앞 기차가 꺾여서 가장 가까운 뒤쪽 모서리가 여유공간을 띄고 뒤 기차의 앞면보다 앞에 있을 수 있는 거리
지금 기본적인 거리 유지도 안 되는 상황이라;;
기차 두칸 각각의 방향벡터를 얻어서 기본거리 + 추가거리 * sin ( 앞놈과 뒷놈 벡터 ) 절대값 곱해주며 ㄴ될거같은데..
거리만 보면요
진자 기차처럼 해보는건 어떤가 싶은데 맨앞 기관차에서만 속도 조절하고 뒷칸들은 같은속도 전달받아서 같은 속도로 움질이는거지 - DCW
열차 마다 후방 좌우 중심에 연결부 달아주고 뒷칸넘들은 연결부 포커스로 회전 - DCW
hong // 오 ㄳ 함 해볼께여
KimJa // 회전이 완만하면 괜찮은데 움짤처럼 현실에 없을 법한 곡선은 그렇게 하면 바퀴나 레일도 처리해줘야 하는 것 같아서여
꼭 진짜 기차처럼 만들필요있나? 첫번째 기차는 제대로 가니까 모든기차를 첫번째 기차처럼 만들고 그냥 그 사이만 이어주면 되지않아? 속도도 같을테니 사이가 벌어질일도 없고
넵 맞습니다... 분명히 똑같이 달리면 똑같이 움직여야 할텐데 달리다보면 간격이 점차 달라짐...
각각 다른기차 취급 받는데 간격이 달라질리가? 둘이 어떤 관계가 있으니까 간격이 달라지겠징
위치를 다 똑같이 해놓고 돌리니까 계속 겹쳐있는데 앞 열차를 0,0,0 뒤 열차를 0,0,2 이렇게 해서 돌리면 값이 달라지넹;;
아니면 앞차의 움직임을 녹화해서 뒤차에게 시간차를 두고 보내주면 어떰??
ㅋㅋ overlapsphere가 이상하게 인식한 걸 몰라서 뻘짓했네;; 이제 유지된당~ 근데 곡선에서 거리를 어케 멀어지게 하지... 휴
근데 직선에선 간격을 같게, 커브에선 다르게 하려는 이유가 뭐임? 현실에서의 기차에서도 모든 객차는 속도가 같은게 정상 아닌가? 혹시 커브시 두 객차의 회전을 자연스럽게 하려고 그러는 거라면 오히려 객차가 4~5개씩 연결된 경우 객차마다 속도가 다 달라져서 엄청 이상해 보일 것 같은데? 지금은 객차의 길이 대비 커브가 너무 급해서 물리적으로 저런 모양 이상으로 나올수가 없는데 그걸 억지로 객차의 속도로 보정하려고 하면 객차와 객차 사이는 훨씬 더 멀어져야 하고 움직임이 이상해질 것 같음.
겹치는 부분이 생겨서 조금만 늘려주려고 하는데 ㅠㅠ
와 님 말대로 여러 개 더 붙여보니까 문제가 생기네요..