가장 널리 사용되는 C ++ 벡터 / 매트릭스 수학 / 선형 대수 라이브러리는 무엇이고 비용과 이점은 무엇입니까? [닫은]


243

많은 프로젝트가 행렬 수학을 수행해야 할 필요성이 천천히 발생하고 일부 벡터 클래스를 먼저 구축하고 절반에 의존하는 사용자 정의 선형 대수 라이브러리를 구축 할 때까지 기능을 천천히 추가하는 함정에 빠지게됩니다.

접선 적으로 관련된 라이브러리 (예 : OpenCV, OpenSceneGraph)에 의존하지 않는 동안 피하고 싶습니다.

일반적으로 사용되는 행렬 수학 / 선형 대수 라이브러리는 무엇이며 왜 서로를 사용하기로 결정합니까? 어떤 이유로 사용하지 말아야 할 것이 있습니까? 특히 기하학적 / 시간 컨텍스트 * (2,3,4 Dim) *에서 이것을 사용하고 있지만 앞으로 더 높은 차원의 데이터를 사용할 수 있습니다.

API, 속도, 메모리 사용, 너비 / 완전성, 좁음 / 특성, 확장 성 및 / 또는 성숙도 / 안정성 중 어느 것과 관련하여 차이점을 찾고 있습니다.

최신 정보

나는 Eigen3을 사용하여 결국 매우 기뻤습니다.


2
OSG와 OpenCV에 대해 언급 했으므로 3D 그래픽 유형 벡터 / 매트릭스, 즉 3x3 및 4x4 매트릭스가 필요하다고 생각합니다. 나는 그 대답을 기반으로했지만, 이것을 정확히 어떻게 사용하고 있는지 지정할 수 있습니다-행렬 해결이 필요합니까? 고차원 매트릭스 수학? 등
리드 Copsey

지금은 2D 지오메트리 기반 작업만을 수행하고 있지만 2D 데이터에 대해 3x3 작업이 필요한 경우가 있으므로 3D 데이터에 따라 4x4 작업이 필요한지 확실하지 않습니다. 회사 전체에서 공용 라이브러리를 사용하고 싶습니다. 나는 트레이드 오프가 무엇인지 잘 이해하지 못한다. 더 일반적 일수록 좋을 것이지만, 어떤 비용이 문제가됩니까?
Catskul

1
기하학적 변환을 수행하는 경우 대답에서 언급했듯이 GGT를 보는 것이 좋습니다. 그것은 매우 완벽하지만 실제로는 아무 것도하지 않으므로 매우 깨끗하고 쉬운 옵션입니다. BLAS 및 LAPACK은 기하학적 변환이 아니라 과학 및 수학을위한 복잡한 복합 행렬 솔루션 (예 : 50x50 행렬, 희소 행렬 등)에 적합합니다.
Reed Copsey

답변:


114

이를 위해 Generic Graphics Toolkit 에 정착 한 프로젝트가 꽤 있습니다 . GMTL은 훌륭합니다. 아주 작고 기능적이며 매우 신뢰할 수있을 정도로 널리 사용되었습니다. OpenSG, VRJuggler 및 기타 프로젝트는 모두 수동 롤터 / 매트릭스 수학 대신 이것을 사용하도록 전환했습니다.

템플릿을 통해 모든 작업을 수행하므로 매우 유연하고 빠릅니다.


편집하다:

의견 토론과 편집 후에 특정 구현의 이점과 단점, 상황에 따라 다른 것을 선택하는 이유에 대해 더 많은 정보를 버리겠다고 생각했습니다.

GMTL -

이점 : 그래픽 엔진을 위해 특별히 설계된 간단한 API입니다. 다른 패키지에없는 렌더링 (예 : 평면, AABB, 다중 보간이 포함 된 쿼터니언 등)에 맞춰진 많은 기본 유형을 포함합니다. 매우 낮은 메모리 오버 헤드, 매우 빠르고 사용하기 쉽습니다.

단점 : API는 특히 렌더링 및 그래픽에 중점을 둡니다. 일반용 (NxM) 매트릭스, 매트릭스 분해 및 해결 등은 포함되지 않습니다. 이들은 기존 그래픽 / 지오메트리 응용 프로그램의 영역을 벗어나기 때문입니다.

아이겐 -

장점 : 사용하기 쉬운 Clean API . 쿼터니언 및 기하 변환 기능이 있는 형상 모듈 을 포함합니다 . 메모리 오버 헤드가 적습니다. 큰 NxN 행렬 및 기타 범용 수학 루틴을 완벽 하게 수행 합니다.

단점 : 원하는 것보다 약간 더 큰 범위 일 수 있습니다 (?). GMTL과 비교할 때 기하학적 / 렌더링 특정 루틴이 줄어 듭니다 (예 : 오일러 각도 정의 등).

IMSL -

장점 : 매우 완벽한 숫자 라이브러리. 매우 빠릅니다 (아마도 가장 빠른 솔버). 지금까지 가장 크고 가장 완벽한 수학적 API. 상업적으로 지원되고 성숙하며 안정적입니다.

단점 : 비용-저렴한 것은 아닙니다. 기하 형 / 렌더링 관련 방법은 거의 없으므로 선형 대수 클래스 위에 롤링해야합니다.

NT2 -

장점 : MATLAB에 익숙한 경우 더 친숙한 구문을 제공합니다. 대형 행렬 등에 대한 전체 분해 및 해결 기능을 제공합니다.

단점 : 렌더링에 중점을 두지 않고 수학. 아마도 아이겐만큼 성능이 떨어질 것입니다.

LAPACK -

장점 : 매우 안정적이고 검증 된 알고리즘. 오랫동안 주변에 있었다. 완벽한 행렬 해결 등 모호한 수학을위한 많은 옵션.

단점 : 경우에 따라 성능이 좋지 않습니다. 사용을 위해 홀수 API와 함께 포트란에서 이식되었습니다.

개인적으로, 그것은 하나의 질문으로 귀결됩니다-어떻게 이것을 사용할 계획입니까? 렌더링과 그래픽에만 중점을 둔 경우 Generic Graphics Toolkit 이 좋습니다. 성능이 우수하고 자체적으로 구현하지 않아도 유용한 유용한 렌더링 작업을 즉시 지원하기 때문입니다. 범용 행렬 해석 (즉, 큰 행렬의 SVD 또는 LU 분해)이 필요한 경우 Eigen 을 처리하고 일부 기하학적 연산을 제공하며 큰 행렬 솔루션으로 성능이 우수하므로 Eigen을 사용 합니다. 매트릭스 / 벡터 위에 자체 그래픽 / 기하학적 연산을 더 작성해야 할 수도 있지만 끔찍한 것은 아닙니다.


GMTL을 결정하기 전에 다른 라이브러리를 평가 했습니까? 피상적 인 비교를 통해 아이겐이 더 잘 지원되었다고 믿었지만 각 웹 사이트를 검토 한 결과였습니다. 다른 것보다 특별한 장점이 있습니까?
캐츠 쿨

아이겐도 잘 작동합니다. 내가 조사 할 당시에는 성숙하지 않았지만이 시점에서 이것이 좋은 선택이라고 생각합니다. GMTL은 상당히 널리 사용되어 왔으며 사용하기로 결정했을 때 매우 성숙하고 견고했습니다.
리드 콥시

내 질문을 매우 중요하게 생각할 것 같습니다. "이것이 더 좋아 보인다"와 같이 주관적으로 선택했거나 차이를 만든 특정 기능 (api, 속도, 메모리 사용, 폭, 좁음, 확장 성)이있는 곳에서 주관적으로 선택 했습니까? 성숙도가이 기준에 해당한다고 가정하지만, 성숙도가 유일한 지표라면 BLAS 또는 LAPACK 기반 옵션을 선택했을 것입니다.
Catskul

여러 옵션을 시도한 후 이것을 선택하고 성능, 유용성 및 낮은 런타임 / 컴파일 시간 오버 헤드를 기반으로했습니다. 아이겐은 그 시점보다 지금 훨씬 나아 보이기 때문에 그들 사이에서 판단 할 수 없습니다. 그러나 우리는 GMTL을 사용하여 매우 기뻤습니다.
리드 콥시

그것이 GMTL을 좋아하는 이유 중 일부입니다. 사용하기가 매우 자연스럽고 작업하기가 매우 쉽습니다. 또한이 경우 기하학적 변환 및 쿼터니언 회전을 직접 처리하는 것에 대해 걱정했기 때문에 필요한 모든 것을 지원했습니다.
Reed Copsey

38

그래서 저는 매우 비판적인 사람이고, 도서관에 투자하려고한다면, 내가 무엇을 받고 있는지 더 잘 알고있을 것입니다. 면밀히 조사 할 때 아첨에 대해 비판하고 밝게하는 것이 낫다고 생각합니다. 잘못된 점은 올바른 것보다 미래에 더 많은 영향을 미칩니다. 그래서 여기에 도움이 될만한 답변을 제공하기 위해 여기에 조금 올라가서이 길을 여행하는 다른 사람들을 도울 수 있기를 바랍니다. 이것은 내가이 라이브러리로 수행 한 작은 검토 / 테스트를 기반으로한다는 것을 명심하십시오. 오, 나는 리드의 긍정적 인 설명을 훔쳤다.

나는 Eigen2의 불안전성이 너무 큰 단점으로 인해 독특함에도 불구하고 GMTL과 함께 갔다는 것을 언급 할 것입니다. 그러나 최근 Eigen2의 다음 릴리스에는 정렬 코드를 차단하고 안전하게 만드는 정의가 포함되어 있음을 알게되었습니다. 그래서 전환 할 수 있습니다.

업데이트 : Eigen3으로 전환했습니다. 특유의 특성에도 불구하고 그 범위와 우아함은 무시하기가 어렵고 안전하지 않은 최적화는 정의로 끌 수 있습니다.

아이겐 2 / 아이겐 3

장점 : LGPL MPL2, 깨끗하고 잘 설계된 API, 사용하기 쉽습니다. 활기찬 커뮤니티와 잘 유지되는 것 같습니다. 메모리 오버 헤드가 적습니다. 고성능. 일반적인 선형 대수를 위해 만들어졌지만 훌륭한 기하 기능도 사용할 수 있습니다. 모든 헤더 lib, 링크 필요 없음

관용구 / 단점 : ( 현재 개발 지점 Eigen3 에서 사용 가능한 일부 정의에 의해 일부 / 모두 피할 수 있음 )

  • 안전하지 않은 성능 최적화는 신중하게 다음 규칙을 따라야합니다. 규칙을 따르지 않으면 충돌이 발생합니다.
    • 당신은 단순히 가치를 안전하게 전달할 수 없습니다
    • 고유 유형을 멤버로 사용하려면 특별한 할당 자 사용자 정의가 필요합니다 (또는 충돌)
    • stl 컨테이너 유형 및 다른 템플릿과 함께 사용하면 특별한 할당 사용자 정의가 필요합니다 (또는 충돌이 발생합니다)
    • 특정 컴파일러는 함수 호출 (GCC 창)에서 충돌을 방지하기 위해 특별한주의가 필요합니다.

GMTL

이점 : 그래픽 엔진을 위해 특별히 설계된 LGPL, 상당히 간단한 API입니다. 다른 패키지에없는 렌더링 (예 : 평면, AABB, 다중 보간이 포함 된 쿼터니언 등)에 맞춰진 많은 기본 유형을 포함합니다. 매우 낮은 메모리 오버 헤드, 매우 빠르고 사용하기 쉽습니다. 모든 헤더 기반이며 링크가 필요하지 않습니다.

관용구 / 단점 :

  • 기발한 API
    • 다른 라이브러리의 myVec.x ()는 myVec [0]을 통해서만 사용할 수 있습니다 (가독성 문제).
      • 점의 배열 또는 stl :: vector로 인해 pointsList [0] [0]과 같은 작업을 수행하여 첫 번째 점의 x 구성 요소에 액세스 할 수 있습니다.
    • 컴파일러가 불필요한 임시 온도를 제거 할 때 최적화를위한 순진한 시도에서 cross (vec, vec)를 제거하고 makeCross (vec, vec, vec)로 대체했습니다.
    • 정규 수학 연산은 일부 최적화 기능을 종료하지 않는 한 정규 유형을 반환 vec1 - vec2하지 않습니다 . 예를 들어 : 정규 벡터를 반환하지 않으므로 작동 length( vecA - vecB )하지만 실패 vecC = vecA - vecB합니다. 당신은 다음과 같이 포장해야합니다 :length( Vec( vecA - vecB ) )
    • 벡터에 대한 연산은 멤버가 아닌 외부 함수에 의해 제공됩니다. 공통 심볼 이름이 충돌 할 수 있으므로 어디에서나 범위 해상도를 사용해야 할 수도 있습니다.
    • 당신이해야
        length( makeCross( vecA, vecB ) )
      하거나
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      그렇지 않으면 시도 할 수있는 곳
        vecA.cross( vecB ).length()
  • 잘 관리되지 않은
    • 여전히 "베타"로 주장
    • 정상적인 기능을 사용하기 위해 필요한 헤더와 같은 기본 정보가없는 문서
      • Vec.h에는 Vector에 대한 연산이없고 VecOps.h에는 일부가 있고 다른 것에는 Generate.h에 있습니다. VecOps.h의 cross (vec &, vec &, vec &), Generate.h의 [make] cross (vec &, vec &)
  • 미성숙 / 불안정한 API; 여전히 변화하고 있습니다.
    • 예를 들어 "cross"가 "VecOps.h"에서 "Generate.h"로 이동 한 다음 이름이 "makeCross"로 변경되었습니다. 더 이상 존재하지 않는 이전 버전의 함수를 계속 참조하므로 문서 예제가 실패합니다.

NT2

웹 페이지의 프랙탈 이미지 헤더가 콘텐츠보다 더 관심이있는 것처럼 보이기 때문에 말할 수 없습니다. 심각한 소프트웨어 프로젝트보다는 학술 프로젝트처럼 보입니다.

2 년 전의 최신 릴리스.

아마도 어딘가에 프랑스어로 된 것이 있지만 아마도 영어로 된 문서는 없습니다.

캔 트는 프로젝트 주변에서 커뮤니티의 흔적을 찾습니다.

LAPACK & BLAS

장점 : 오래되고 성숙한.

단점 :

  • 정말 엉뚱한 API를 가진 공룡으로 오래된

1
Eigen 정렬 된 어설 션과 관련하여 : 작은 데이터 집합에 대한 SSE (1,2,3 또는 4) 작업에서 고성능을 얻으려면 정렬 된 데이터가 절대적으로 필요합니다. 정렬되지 않은로드 / 저장 작업이 훨씬 느립니다. 정렬 또는 정렬되지 않은로드 / 스토어 간의 결정에도 시간이 걸립니다. 인터페이스를 "정렬 된"작업과 "정렬되지 않은"작업으로 분리하지 않는 한 "일반적인 목적"구현은 모든 사람에게 올바른 일을하는 데 정말 힘든 시간이 될 것입니다.
Joris Timmermans

@ Catskul Eigen3을 사용하고 싶습니다. "안전하지 않은 최적화는 정의로 끌 수 있습니다"를 확장 해 주시겠습니까? Eigen2 아래에 나열된 다른 문제는 문서 에서 정렬 문제 관련 항목 아래 에 자세히 설명되어 있습니다 . 나는이 문제들과 함께 살 수있다.
Ali

안전 문제는 모든 정렬과 관련이 있으며 Eigen2와 동일합니다. Eigen2에 문제가 없다면 Eigen3에 문제가 없을 것입니다.
Catskul

2
BLAS 및 LAPACK은 실제로 라이브러리가 아니라 사양 / API입니다. netlib 또는 ATLAS 및 OpenBLAS와 같은 다른 구현으로 초기 구현을 언급 할 수 있습니다.
Foad

12

가치있는 것을 위해, 나는 Eigen과 Armadillo를 모두 시도했습니다. 아래는 간단한 평가입니다.

고유 장점 : 1. 완전 독립형 – 외부 BLAS 또는 LAPACK에 의존하지 않습니다. 적절한 문서. 3. 테스트에 넣지 않았지만, 빠른 속도로 제공됩니다.

단점 : QR 알고리즘은 상단 삼각형에 R 행렬이 포함 된 단일 행렬 만 반환합니다. 나머지 행렬의 출처를 모르고 Q 행렬에 액세스 할 수 없습니다.

Armadillo 장점 : 1. 광범위한 분해 및 기타 기능 (QR 포함). 2. 상당히 빠르지 만 (표현 템플릿 사용) 다시 한 번 높은 차원으로 밀지 않았습니다.

단점 : 1. 매트릭스 분해를 위해 외부 BLAS 및 / 또는 LAPACK에 의존합니다. 2. 설명서에 IMHO가 부족합니다 (#define 문을 변경하는 것 이외의 사양 wrt LAPACK 포함).

자체 포함되어 있고 사용하기 쉬운 오픈 소스 라이브러리를 사용할 수 있다면 좋을 것입니다. 나는 10 년 동안이 같은 문제에 부딪 쳤고 좌절합니다. 언젠가는 C에 GSL을 사용하고 그 주위에 C ++ 래퍼를 작성했지만 현대식 C ++, 특히 표현식 템플릿의 장점을 사용하여 21 세기에 C를 망칠 필요는 없습니다. 그냥 내 tuppencehapenny입니다.


2
Armadillo 는 의도적으로 Matlab과 유사한 구문을 사용하므로 사용하기 쉽습니다. "문서가 부족합니다 ... 사양 wrt LAPACK"에 대해 당신이 무엇을 의미하는지 잘 모르겠습니다. 이 문서에는 사용 가능한 모든 기능과 사용 방법에 대한 예가 문서화되어 있습니다. C ++ 래퍼 라이브러리에 대한 전체 요점은 LAPACK의 복잡성과 세부 정보를 추상화하는 것입니다. Armadillo가 LAPACK을 어떻게 호출하는지 보려면 언제든지 소스를 탐색 할 수 있습니다.
mtall

Eigen의 QR 분해에 대해 Eigen2 또는 Eigen3을 의미합니까?
qed

11

인텔 프로세서에서 고성능 매트릭스 / 선형 대수 / 최적화를 찾고 있다면 인텔의 MKL 라이브러리를 살펴 보겠습니다.

MKL은 빠른 런타임 성능을 위해 세 심하게 최적화되어 있으며 대부분은 매우 성숙한 BLAS / LAPACK 포트란 표준을 기반으로합니다. 또한 사용 가능한 코어 수에 따라 성능이 확장됩니다. 사용 가능한 코어를 통한 핸즈프리 확장 성은 컴퓨팅의 미래이며 새로운 프로젝트에 멀티 라이브러리 프로세서를 지원하지 않는 수학 라이브러리를 사용하지 않을 것입니다.

간단히 말해 다음과 같습니다.

  1. 기본 벡터-벡터, 벡터-행렬 및 행렬-행렬 연산
  2. 행렬 분해 (LU 분해, 에르 미트, 스파 스)
  3. 최소 제곱 피팅 및 고유 값 문제
  4. 스파 스 선형 시스템 솔버
  5. 비선형 최소 제곱 솔버 (신뢰 영역)
  6. FFT 및 컨볼 루션 (convolution)과 같은 플러스 신호 처리 루틴
  7. 매우 빠른 난수 생성기 (메르 센 트위스트)
  8. 훨씬 더 .... 참조 : 링크 텍스트

단점은 필요한 루틴에 따라 MKL API가 상당히 복잡 할 수 있다는 것입니다. 또한 고성능 이미지 처리 작업을 목표로하지만 IPP (Integrated Performance Primitives) 라이브러리를 살펴볼 수도 있습니다.

CenterSpace 소프트웨어, .NET 수학 라이브러리, centerspace.net


8

나는 EigenNT2 에 대해 좋은 소식을 들었지만 개인적으로 사용하지는 않았습니다. Boost.UBLAS있습니다 .이 치아가 조금 길어지고 있다고 생각합니다. NT2의 개발자들은 Boost에 들어 가려는 의도로 다음 버전을 구축하고 있습니다.

내 린 alg. 4x4 매트릭스를 넘어 설 필요가 없으므로 고급 기능에 대해서는 언급 할 수 없습니다. 방금 몇 가지 옵션을 지적하고 있습니다.


내 경험 (더 큰 행렬)에서 Boost.UBLAS가 더 많이 사용됩니다. 그러나 그것을 조사했을 때, 나는 그것을 좋아하지 않았으며 (주로 문서 때문에) Eigen에 집중했습니다. Eigen에는 geometry 모듈 이 있지만 직접 사용하지는 않았습니다.
Jitse Niesen

Eigen은 분명히 ROS (윌로우 차고), Celestia, Koffice 및 libmv에서 사용됩니다. UBLAS에 대한 이야기가 있지만이를 사용하여 광고하는 프로젝트에서 어려움을 겪었습니다. NT2 용 Ditto. 어떤 좋은 소식을 들었는지 자세히 설명해 주시겠습니까?
Catskul

부스트 메일 링리스트에서 부스트에 현대적인 LinAlg 라이브러리를 추가하는 것에 관한 토론에서 Eigen과 NT2가 가능한 후보로 언급되었지만 NT2 개발자 만이 그것을 추구하는 데 관심을 표명했습니다. 두 도서관 모두 괜찮은 것처럼 보였다. 당신이 말했듯이, Eigen은 조금 더 인기가 있고 C ++-ish입니다. NT2는 MATLAB을 최대한 모방하도록 설계되었습니다.
Jeff Hardy

8

저는이 주제를 처음 했기 때문에 많은 것을 말할 수 는 없지만 BLAS 는 과학 컴퓨팅의 표준입니다. BLAS는 실제로 많은 구현이있는 API 표준입니다. 어떤 구현이 가장 인기가 있는지 또는 왜 확실하지 않습니다.

일반적인 선형 대수 연산 (시스템 해결, 최소 제곱 회귀, 분해 등)을 수행하려면 LAPACK을 살펴보십시오 .


7

무엇에 대한 GLM ?

GLSL (OpenGL Shading Language) 사양을 기반으로하며 MIT 라이센스에 따라 릴리스됩니다. 그래픽 프로그래머를위한 명확한 목표


그래픽 프로그래밍 벡터와 행렬을 제공합니다. GLSL을 준수하기 위해 많은 양의 오버 헤드가 발생합니다 (GLSL에서 할 수 있다면 GLSL에서 수행하는 것이 GL 4.x에서 더 좋습니다). 많은 그래픽 프로그래밍 기본 요소 (절두체, AABB, BB, 타원체) ). 그 지글 지글 인터페이스는 비만입니다. 코드 생성으로 ".xyzz ()"함수가 생성 된 경우 훨씬 더 나은 대안이 될 수 있습니다. OpenGL 응용 프로그램을 프로토 타입해야하고 더 큰 프로젝트에서 부정적인면을 보이기 시작하면 완벽합니다. 수학 라이브러리를 코딩하지 마십시오.
CoffeDeveloper

5

Eigen에 대한 투표를 추가하겠습니다. 다른 라이브러리에서 많은 코드 (3D 지오메트리, 선형 대수 및 미분 방정식)를이 라이브러리로 포팅하여 거의 모든 경우에서 성능과 코드 가독성을 향상 시켰습니다.

언급되지 않은 한 가지 장점 : Eigen과 함께 SSE를 사용하는 것이 매우 쉬워 2D-3D 작업의 성능이 크게 향상됩니다 (모든 것이 128 비트로 채워질 수 있음).


1
전체 "이 작업을 수행하면 다음을 확인하십시오 ..."라는 것이 약간의 붉은 깃발처럼 보입니다. 지금까지 나는이 문제에 두 번 뛰어 들었고 그것을 사용하기 시작했습니다. 나는 각 라이브러리의 모든 종류의 특질을 알기 위해 미래 개발자에게 부담을주지 않기를 바랐습니다. 특히 회원이있을 때마다 특정 매크로를 사용하지 않으면 충돌이 발생하는 정렬 문제와 개인을 위해 기능을 전파했다는 사실 여러 헤더에 걸쳐 클래스. 혼자서 선택하는 것을 방해하지는 않지만 약간의 붉은 깃발을 보냈습니다.
Catskul

1
정렬 및 해당 매크로는 SSE를 사용하는 경우에만 중요합니다. SIMD를 사용하면 사용하는 라이브러리에 관계없이 이러한 문제가 발생합니다. 최소한 Eigen은 충돌이 아니라 문제를 직접 가리키는 의미있는 오류 메시지를 제공합니다.
ima

정렬 매크로를 피하는 쉬운 방법이 있습니다. 포인터 나 참조를 멤버로 사용하십시오.
ima

1
나는 그것이 사실이라고 생각하지 않습니다. 특수 SSE 옵션을 사용하지 않았으며 stl 컨테이너와 함께 사용한 후 몇 가지 충돌이 발생했습니다. 예, 유용한 메시지를 제공한다는 것을 알고 있습니다. 예, 특별한 지시 사항이 있다는 것을 알고 있습니다. 그러나 이것이 제 요점입니다. 포함 된 각 라이브러리에 대한 특별 지침으로 다른 개발자에게 부담을주고 싶지 않습니다. 예를 들어 가치를 지나치지 않는 것은 너무 많습니다.
Catskul September

방금 최신 개발 지점에 정렬을 해제하고 관련 문제를 피하는 데 사용할 수있는 정의가 있음을 알았습니다.
Catskul

4

좋아, 나는 당신이 찾고있는 것을 알고 있다고 생각합니다. Reed Copsey가 제안한 것처럼 GGT는 꽤 좋은 솔루션 인 것으로 보입니다.

개인적으로 우리는 합리적 NURBS와 베 지어의 많은 합리적 포인트를 다루기 때문에 우리 자신의 작은 라이브러리를 굴 렸습니다.

대부분의 3D 그래픽 라이브러리는 프로젝션 수학에 기초가없는 프로젝션 포인트를 사용하여 계산을 수행하는 것으로 나타났습니다. 우리는 이론적 인 토대가 확고하고 포인트 유형의 수를 줄인 Grassmann 포인트를 사용했습니다. Grassmann 포인트는 기본적으로 사람들이 현재 사용하는 것과 동일한 계산이며 강력한 이론의 이점을 제공합니다. 가장 중요한 것은 우리의 생각이 더 명확 해 지므로 버그가 줄어든다는 것입니다. Ron Goldman은 " 컴퓨터 그래픽 의 대수 및 기하학 기초" 라는 컴퓨터 그래픽에서 Grassmann 포인트에 관한 논문을 썼습니다 .

귀하의 질문과 직접 ​​관련이 없지만 흥미로운 내용입니다.


나는 트레이드 오프가 무엇인지 알지 못한다는 점에서 의도적으로 개방적입니다. 지오메트리가 우리의 주요 관심사라고 말할 수 있습니다. 지오메트리의 치수가 명확하지 않습니다. 현재 2/3 (2 + 시간)이며 가정 상 상당히 높을 수 있습니다 (3dims + 시간 + multi-dim-costmaps).
Catskul

나는 그 질문에 동의한다. 예를 들어, 이러한 종류의 많은 응용 프로그램에는 실시간 (일관된 시간 동작) 성능이 필요하지만 다른 많은 응용 프로그램에서는 일관성 및 / 또는 정확성을위한 속도를 포기하는 것이 좋습니다.
TED

당신은 당신이 조사 한 도서관에 대해 말하고 있습니까, 아무도 NURBS와 베 지어를 돌보지 않았습니까? 기존 라이브러리 중 하나를 사용하지 않고 그와 함께 NURBS 및 베 지어 지원을 빌드해야하는 특별한 이유가 있습니까?
Catskul

내가 말하려고하는 것은 합리적인 NURBS와 베 지어가 대부분의 3D 응용 프로그램보다 합리적인 제어 포인트를 훨씬 많이 사용하므로 더 많은 실수를하고 있다는 것입니다. 일반적으로 대부분의 3D 앱은 원근 변환을 거친 후까지 바닐라 3D 점과 벡터 만 갖습니다. 우리의 알고리즘의 대부분은 올바르게 등 뒤로가는 등, / / 합리적인 투영과 직교 점을 가중 처리 할 수 있습니다
tfinniga


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