반응형
참고
- 쿼터니언으로 구현한 단진자의 운동
- 쿼터니언으로 구현한 단진자의 운동 확장
- 독립된 단진자의 운동
- 런타임에 단진자 운동 설정하기
마우스로 단진자를 런타임에 이동시켜서 다시 단진자 운동이 되도록 해보자.
편의상 x는 0으로 고정한다. (오브젝트 드래그가 yz 평면만 가능하도록 한다.)
Start에서 했던 초기화를 initSettings로 모두 옮긴다.
startRot도 여기서 0으로 초기화한다.
void initSettings()
{
float angle = Vector3.Angle(this.transform.position - pivot.position, Vector3.down);
startAngle = 0.0f; endAngle = angle * 2;
Vector3 normal
= getNormal(pivot.position + Vector3.down, pivot.transform.position, this.transform.position);
startPlaneNormal = normal;
setPlane(pivot.position + Vector3.down, pivot.transform.position, this.transform.position);
startPO = (this.transform.position - pivot.position).normalized;
distance = Vector3.Distance(this.transform.position, pivot.position);
startRot = 0.0f;
}
드래그로 오브젝트 움직이기를 참고하여 마우스 이벤트를 아래와 같이 구현한다.
OnMouseUp이 실행되면 모두 초기화되고 새롭게 단진자 운동이 시작된다.
void OnMouseDown()
{
isDragging = true;
}
void OnMouseDrag()
{
float distance = Camera.main.WorldToScreenPoint(transform.position).z;
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance);
Vector3 objPos = Camera.main.ScreenToWorldPoint(mousePos);
objPos.x = 0;
this.transform.position = objPos;
}
void OnMouseUp()
{
initSettings();
isDragging = false;
}
FixedUpdate에서는 Drag 중일 때는 실행되지 않도록 하면 된다.
void FixedUpdate()
{
if (isDragging) return;
...
여기서는 speed가 일정하지만
줄의 길이와 중력에 따라 speed를 자동으로 변경하면 더 그럴듯한 단진자 운동을 구현할 수 있다.
위의 실행결과는 아래의 unitypackage에서 확인 가능하다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 - 라인 렌더러로 간단한 화살표 만들기 (Make Simple Arrow with LineRenderer) (0) | 2023.04.03 |
---|---|
유니티 - 라인 렌더러를 이용한 단진자 속도의 시각화 (0) | 2023.04.03 |
유니티 - 독립된 단진자의 운동 (Independent Simple Pendulum with Unity LerpAngle) (0) | 2023.03.29 |
유니티 - 쿼터니언으로 구현한 단진자의 운동 확장 (Expanded Simple Pendulum with Unity Quaternion) (0) | 2023.03.29 |
유니티 - 쿼터니언으로 구현한 단진자의 운동 (Simple Pendulum with Unity Quaternion) (0) | 2023.03.29 |
댓글