1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // 언리얼 엔진 코드에서 가져옴. 지정된 각도에 대한 두 삼각함수를 함께 가져오는 함수. static FORCEINLINE constexpr void GetSinCosRad(float& OutSin, float& OutCos, float InRadian) { // Copied from UE4 Source Code // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. float quotient = (InvPI * 0.5f) * InRadian; if (InRadian >= 0.0f) { quotient = (float)((int)(quotient + 0.5f)); } else { quotient = (float)((int)(quotient - 0.5f)); } float y = InRadian - (2.0f * PI) * quotient; // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). float sign = 0.f; if (y > HalfPI) { y = PI - y; sign = -1.0f; } else if (y < -HalfPI) { y = -PI - y; sign = -1.0f; } else { sign = +1.0f; } float y2 = y * y; // 11-degree minimax approximation OutSin = (((((-2.3889859e-08f * y2 + 2.7525562e-06f) * y2 - 0.00019840874f) * y2 + 0.0083333310f) * y2 - 0.16666667f) * y2 + 1.0f) * y; // 10-degree minimax approximation float p = ((((-2.6051615e-07f * y2 + 2.4760495e-05f) * y2 - 0.0013888378f) * y2 + 0.041666638f) * y2 - 0.5f) * y2 + 1.0f; OutCos = sign * p; } | cs |
이거 뭔소린지 이해가안갔는데 전체코드를보니까
1 2 3 4 | void mysincos(float& OutSin, float& OutCos, float InRadian) { OutSin = sin(InRadian); OutCos = cos(InRadian); } | cs |
그냥 이렇게 적용이 되더라고요 위방식으로하는 이유가 따로있어? 연산이 엄청나게 빨라지나
밑에 그 sin, cos함수는 뜯어봤음? 그 안에는 저렇게 되어 있을수도 있는데?
sin이 오픈이 되있는 함수인가요?
지금 코드가 C++인거 같은데, 저 함수 C++ 표준라이브러리 함수를 호출하는거면 당연히 공개되어 있겠지, 언리얼 꺼면 언리얼 소스 까보면 되고
그리고 일반적으로 라이브러리에서 제공하는 sin이랑 cos이랑, 실제 게임엔진에서 즐겨쓰는 sin,cos은 구현방식이 정확도보단 퍼포먼스에 맞추는 편이라, 많이 다를수도있어. sqrt구하는 것도 되게 느린데, 존 카멕이 퀘이크에서 고속 inverse sqrt 만든거 유명한 일화잖어.
https://en.wikipedia.org/wiki/Fast_inverse_square_root
그건아는데 저것도 무슨 공식같은거로 연산이되나 궁금해서
저걸 보고 내가 어케암. 수학자도 아니고. 내가 아는 방법은 sin cos 룩업테이블 만들어서 그 사이에 보간값으로 연산하는게 빠르다는거 말고는 없음, 유니티도 그렇게 하고 있고. 저건 뭐 언리얼식 최적화인가, 나도 모르지
검색해보니까 역시나 내가 건드릴 영역은 아니네. 그냥 저런게 있구나 하고 넘어가는게 좋을거같은데?
https://github.com/microsoft/DirectXMath/blob/main/Inc/DirectXMathMisc.inl
보니까
DirectX에서도 쓰는 Sin구현인거 같은데, 주석만 읽어봐도 라디안을 -pi,+pi사이에 뭐 매핑시키고 또 다시 어디매핑시키고, 11-degree approximation 뭐시기 하는데 이것도 뭐 최적화를 위한 기법인거 같네.
https://gist.github.com/publik-void/067f7f2fef32dbe5c27d6e215f824c91
ㅅㅂ
읽어봐도 뭔지는 모르겠다. 난 여기까지
이런거 그냥 검색해도 나오니까 좀 찾아보고 올려, 질문이 정말 너무한다.
역제곱근은 오 그렇구나하고 흥미로웟는데 이번꺼는 영아니네
난 안나오던데
구현자체에 흥미를 느끼는거였구나. 그럼 파고들만하네. 왜 여깃냐, 엔진개발갤러리없냐, 거기가면 답변만이해줄거같은디
내가 실력은 없어도 검색은 잘하거등