Home 3차원 부드러운 랜덤 움직임
Post
Cancel

3차원 부드러운 랜덤 움직임

해야 하는게 있는데, 어려워서 현실도피 하다가

옆에 언제 시작한지 모르는 만들다만 오브젝트가 있어서 살짝 구현해봤습니다.


(너무 간단해서 써도 되나 싶긴한데.. 흠…)

머리

목표는 3차원 공간에서 한점을 기준으로 원에 비슷하게 랜덤으로 부드럽게 움직이며,

중심점이 멀어지면 따라갈 수 있게 하는 것입니다.


(보간보간보간 하면 뭐 되긴하겠지만.. 이거 진짜 별거없음)

벡터하나를 연속적으로 바꿀려면 가중치를 지정해 가중치 덧뺄셈으로 계산해도 괜찮지만

랜덤값이 크더라도 투영값이 비슷하다면, 거의 의미없는 변화가 되기때문에

쿼터니언을 사용하여 회전시키면 깔끔하게 만들 수 있습니다.

1
2
3
4
5
private Vector3 ContinuousRandomVectorDir(in Vector3 vector, in float scale)
{
    var rot = Quaternion.Euler(Random.Range(-90 * scale, 90 * scale), Random.Range(-90 * scale, 90 * scale), Random.Range(-90 * scale, 90 * scale));
    return rot * vector.normalized;
}



그다음은 뭐 간단합니다. 구한값을 토대로 누산하며, 누산값의 역과 현재방향을 적절히 보간합니다.

이때 누산값과 방향의 보간값은 반대방향이 아니라면 어디론가 휘게 되어있으므로, 적당히 다음방향결정에도 영향을 미치게 됩니다. (조금씩)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
IEnumerator IdleMovement()
{
    Vector3 dir = Vector3.forward;
    while (enabled)
    {
        dir = ContinuousRandomVectorDir(dir, Time.deltaTime) * Random.Range(0.1f, 0.8f) * IdleSpeed * SpeedFactor;
        dir = Vector3.Lerp(-offset, dir, 0.99f);

        offset += dir;
        transform.position += dir;
        transform.rotation = Quaternion.LookRotation(dir);
        yield return null;
    }
}



이렇게만 하면 메이플스토리라는 게임의 아델직업의 스톰스킬같은 느낌의 무언가가 나옵니다

GIF 2024-04-01 오후 3-30-55.gif

하지만 이대로 두면 어딘갈 따라가거나-할 수 없겠죠?

그래서 저는 특정지점으로의 응집을 추가합니다.

마찬가지로 특정점과의 변위값을 통해 위의 누산값에 추가해줍니다

1
2
3
4
5
6
7
8
9
10
11
IEnumerator Cohesion()
{
    Vector3 dir = Vector3.forward;
    while (enabled)
    {
        var diff = transform.position - Root.position;
        offset += diff * CohesionAmount; //CohesionAmount = 0.001

        yield return null;
    }
}

GIF 2024-04-01 오후 4-22-02.gif

그러면 대충 따라가는게 나옵니다.


이차저차해서 공격코드도 추가하면 대충 아래와같은 결과물이 나옵니다.

GIF 2024-04-01 오후 3-56-48.gif

꼬리

처음 구현할땐 테라리아의 테라플라즘이었던것 같은데

구현의 끝은 메이플스토리의 오더가 되었네요.

에라이

This post is licensed under CC BY 4.0 by the author.