공부중

임의의 원 범위 안에서 스폰하기. - 2 본문

Programing

임의의 원 범위 안에서 스폰하기. - 2

곤란 2025. 5. 7. 00:18
반응형

이거 카테고리와 제목을 뭐라 지을까 하다가 여기에 그냥 적어본다.

먼저 이 내용으로 글을 쓴 적이 있다.

https://hannom.tistory.com/185

 

[project_PQ]-[Unity3D] 임의의 원 범위 안에서 스폰하기.

일단 위의 스크린샷은 내가 멍청하게도 Collision충돌로 알아서 밀어내겠지 하고 안일한 생각을 가지다가 is Trigger를 체크한것을 잊어버려서 결국엔 겹치는 현상을 보여주고 있다. -_- 실제 게임

hannom.tistory.com

 

과거에 이 내용으로 글을 썻는데 어쩌다보니 문제가 있던 내용이었던걸 GPT와 대화하다가 깨닫게 되어서 적어보는 글이다.

일단 지금은 언리얼을 다루고 있으므로 어떤 문제가 있는지 언리얼로 출력 결과를 보자.

저번 글을 통해서 저번 글에 적은 코드를 사용해 출력했을경우 반쪽짜리의 결과만 얻을 수 있었다.

 

먼저 코드를 보자 아래는 이전에 작성했던 코드다

    public Vector3 RandomSphereInPoint( float radius )     
    {         
    	// xz 바닥 평면이니까         
        float x = Random.Range(-1.0f, 1.0f);         	
        float temp = Mathf.Pow(1.0f, 2) - Mathf.Pow(x, 2);         
        float z = Mathf.Sqrt(temp);          
        return (new Vector3(x, 0.0f, z) * Random.Range(0.0f, radius)) 
        		+ new Vector3(transform.position.x, 0.0f, transform.position.z);     
    }

출처: https://hannom.tistory.com/185 [공부중:티스토리]

 

원의 중심이 (0,0)이고 반지름이 1인 원의 방정식 x^2 + y^2 = 1 임을 이용해서 구한 방법이었다.

x를 먼저 랜덤하게 결정하고 y로 정리해

y = sqrt(1-x^2) 을 얻게되어 작성한 코드였다.

하지만 sqrt는 양수의 값만 나오기 때문에 위와같이 반쪽짜리 분포가 되는것이다.

해결방법은 간단하게 x의 짝궁인 y의 값(유니티에서는 z)을 랜덤하게 양수로 둘지 음수로 둘지 하면 된다.

결과로 이와 같이 원 안에서 고루 분포되는것을 볼 수 있다.

	const int32 NumPoints = 500;
	const float Radius = 500.0f;
	const FVector Center = GetActorLocation();
    
	for (int32 i = 0; i < NumPoints; ++i)
	{
		float Distance = FMath::RandRange(0.0f, Radius);

		FVector Point;
		Point.X = FMath::RandRange(-1.0f, 1.0f);

		float temp = FMath::Pow(1.0f, 2) - FMath::Pow(Point.X, 2);

		Point.Y = FMath::Sqrt(temp);
		Point.Z = 500.f;

		Point.X *= Distance;
		Point.Y *= Distance;

		if (FMath::RandBool())
		{
			Point.Y *= -1.0f;
		}

		DrawDebugSphere(GetWorld(), Center + Point, 2.f, 16, FColor::Blue, true);
	}

위의 코드는 언리얼에서 출력한 내용의 코드이다.

500번 돌려서 찍어본 내용이다.

GPT에게 물어보면 이것도 문제가 있다면서 여러 수정 사항을 말하긴 하지만 당장 사용하기에는 큰 문제는 없어서 여기서 일단 글을 마친다.

반응형