태양계를 2 배 (또는 긴)를 사용하여 3D 공간에서 정확하게 표현할 수 있습니까?


15

3D 게임에서 전체 태양계를 현실적으로 모델링하면서 "선박"에서 가장 작은 움직임을 처리 할 수있는 3D 게임에서 좌표를 가장 잘 관리하는 방법을 알고 싶습니다 (예 : 아마도 1cm를 가장 작은 것으로 간주 할 수 있음) 프레임의 허용 가능한 움직임). 64 비트 double (또는 64 비트 long)이이를 지원합니까, 아니면 오버플로 문제가 발생합니까? 그렇지 않다면 long 또는 double을 사용해야합니까? 아니면 3D 게임에서 태양계의 위치를 ​​모델링하는 데 가장 적합한 대안은 무엇이라고 생각하십니까? (예 : 배송 거리를 기준으로 한 번에 한 화면에 약간의 시스템을 유지하거나 시스템을 다른 좌표 공간으로 표시하는 등)


어떤 언어를 타겟으로합니까 : C / C ++? 자바? 다른 것?
Laurent Couvidou

4
@lorancou : 관련이 없습니다. 명시 적으로의 크기를 지정했습니다 long.
DeadMG

@DeadMG C / C ++에서 32 비트 일 수 있습니다. 64 비트는 더 많은 것입니다 long long. 그러나 네, 원한다면 nitpicking이라고 부릅니다.
Laurent Couvidou

BigInteger를 사용하십시오. 대부분의 언어는 그것의 변형을 가지고 있습니다-무제한 크기 정수 값 (사용은 O (log (n))입니다)
ashes999

게임이 컴퓨팅에 너무 무겁지 않다면 대답이 될 수 있습니다.
Laurent Couvidou

답변:


11

정수에 대해서는 이미 좋은 대답이 있지만 부동 소수점을 제거하지 않아야한다고 생각합니다. 그의 대답에서 Byte56은 아마도이 엑셀 시트 에서 가져온 명왕성의 최대 궤도로 갈 수있는 옵션을 사용 했기 때문에 그 점을 고수하겠습니다.

태양계의 경계는 다음과 같습니다.

7,376,000,000km = 7.376x10 ^ 9km = 7.376x10 ^ 14cm ≈ 7.4x10 ^ 14cm

두 번 정밀 부동 소수점 형식의 이벤트 15 개 중요한 소수의 최대 정밀도를. 운이 좋으면 : 원점이 태양의 중심에 있고 명왕성 주위의 위치를 ​​사용하는 경우 C ++와 같이 모든 센티미터를 나타낼 수 있습니다 .

printf("%.0Lf\n", 7.4e14);
printf("%.0Lf\n", 7.4e14 + 1.0);
printf("%.0Lf\n", 7.4e14 + 2.0);

Output:
-------
740000000000000
740000000000001
740000000000002

따라서 게임을 명왕성의 궤도로 제한 할 수 있다면 축하합니다! 당신은 그것을 표현하기에 충분한 배정도로 충분한 정밀도를 얻었습니다.

그러나 시뮬레이션 으로 표현하기에 충분 하지만 이것을 고통스럽게 렌더링 할 것으로 기대하지 마십시오 . 32 비트 부동 소수점으로 변환하고 원점을 변경하여 가까운 물체에 충분한 정밀도를 얻을 수 있으며, Z- 버퍼와 카메라 절두체 속임수에 의존하여이 모든 것이 제대로 렌더링되도록해야합니다. .

우주 비행사가 Oort 클라우드 에서 멀리 떨어진 혜성을 방문하기를 원한다면 끝났습니다. 10 ^ 16cm 전후로 정확도를 잃기 시작합니다.

printf("%.0Lf\n", 1.0e16);
printf("%.0Lf\n", 1.0e16 + 1.0);
printf("%.0Lf\n", 1.0e16 + 2.0);

Output:
-------
10000000000000000
10000000000000000 <-- oops
10000000000000002

그리고 물론 더 악화됩니다.

따라서이 경우 고급 솔루션을 사용해보십시오. Peter Freeze의 Game Programming Gems 4 : "2.3 큰 세계 좌표의 정확도 문제 해결" 기사를 살펴 보는 것이 좋습니다 . IIRC, 그는 당신의 필요에 맞는 시스템을 제안합니다. 그것은 실제로 여러 다른 좌표 공간입니다.

그것은 단지 힌트 일뿐입니다. 아마도 당신은 이것을 실행하기 위해 당신 만의 레시피를 사용해야 할 것입니다. 이런 종류의 것을 이미 구현 한 사람이 더 도움이 될 수 있습니다. 예를 들어 Kerbal Space Program 뒤에있는 사람들에게 이메일을 보내지 않겠습니까?

게임에 행운을 빕니다!


1
이 답변은 OpenGL 및 DirectX와 같이 사용되는 3D 부동 소수점 공간에 더 쉽게 매핑되며 좋은 참조가 있기 때문에 좋습니다. 따라서 나는 그것을 답으로 표시했다 :)
Nicholas Hill

Cool :) 보너스로, 이것은 매우 근사하기 때문에 Bruce Dawson의 블로그에서 randomscii.wordpress.com/2012/05/20/… 에있는 수레에 대한 자세한 정보를 찾을 수 있습니다 .
Laurent Couvidou

17

태양계의 "가장자리"에 대해 명왕성을 가정하면 (일부 광전은 3 광년이라고 말하지만) 명왕성은 최대 궤도에서 태양으로부터 약 7,376,000,000 킬로미터입니다. 그것은 7.37600 × 10 ^ 14 센티미터입니다. 직경을 두 배로 늘리면 1,475,200,000,000,000 센티미터가됩니다. 그것은 64 비트 길이의 최대 크기 내에 있습니다. 태양계의 높이는 직경에 비해 무시할 수 있기 때문에 무시할 수 있습니다.

예, 태양계에서 자신의 위치를 ​​나타내는 데 긴 것을 사용할 수 있습니다. 실제로, 부호가있는 long (부호가없는 경우 double)으로 9.75 광년까지 위치를 지정할 수 있습니다.

거리를 찾는 경우에는 해당되지 않습니다. 찾을 수있는 최대 거리는 여행 할 수있는 최대 거리의 제곱근입니다. 이는 거리를 찾기 위해 상세 수준 시스템을 사용하여 극복 할 수 있습니다. 간단한 검사를 통해 거리가 얼마나 떨어져 있는지 (x 값과 y 값을 비교) 추측 한 다음, 거리가 큰 경우 1,000,000 킬로미터 단위를 사용하고 거리가 작은 경우 센티미터 단위로 사용합니다.

물론 의문의 여지가 있습니다. 정말로 원하십니까? 태양계의 99.999 %는 완전히 흥미없는 빈 공간입니다. 정확하게 태양계를 대표한다면 물리학을 정확하게 대표하지 않기를 바랍니다. 태양계를 돌아 다니는 데 시간이 오래 걸립니다. 대부분의 사람들이 관심을 갖기에는 너무 길다.

그리고 태양계의 물체를 그 정확도로 모델링하지 않는 한 왜 정확도가 좋은가? 그것이 당신이 곤경에 처할 곳입니다. 태양의 부피는 1.40900 × 10 ^ 18 입방 킬로미터입니다. 입방 센티미터 스케일에서 단일 비트를 사용하여 공간이 "사용 중"임을 나타내는 데 1.4 × 10 ^ 33 비트 또는 1.6 × 10 ^ 23 기가 바이트가 필요합니다. RAM이 많지 않다고 생각합니다.


3
꽤 자리 잡았습니다. 짧은 버전 : 플로트 정확도는 걱정할 여지가 없습니다.
aaaaaaaaaaaa

1
당신은 것입니다 정수, 심지어 64 비트와 오버 플로우 얻을. 명왕성 주위의 우주선 궤도. 우주선에서 태양까지의 거리를 계산하려고합니다. 제곱. 팔.
Laurent Couvidou

3
마지막 단락의 주장에 강력히 동의하지 않습니다 .OP의 질문은 그대로 완벽하게 이해되며 실제로 1cm의 정확도를 유지하기 위해 모든 (입방) 센티미터의 항목을 기대할 필요는 없습니다.
Steven Stadnicki

1
@StevenStadnicki Fair는 충분하지만 킬로미터 단위에서도 입방 킬로미터 당 1 비트에 대해 164,029,188 기가 바이트입니다. 자동차 속도계에서 원자 정밀도를 요구하는 것과 비슷합니다. 그것은 필요한 것보다 훨씬 정확합니다.
MichaelHouse

1
글쎄, AU 또는 광년 규모로가는 것은 너무 부정확합니다. 우리는 태양계에 대해 이야기하고 있기 때문에. 큰 성운과 같이 더 큰 물체에는 광년이나 파섹이 더 좋습니다.
MichaelHouse

2

BigInteger프로그래밍 언어가 호출하는 모든 것을 사용할 수 있습니다 . 무제한 크기의 정수입니다. 일반적으로 log(n)정수 크기의 스토리지를 사용하여 확장 성이 뛰어납니다 n.

Java와 C #이 있습니다. 다른 언어도 확실합니다. 그렇지 않은 경우 너무 많은 어려움없이 디 컴파일하고 다시 구현할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.