C用の OpenGL 数学 (glm) 
高度に最適化された 2D|3D 数学ライブラリ。 `C` 用の OpenGL Mathematics (glm)としても知られています。 cglm は、数学演算を高速に記述できるようにするためのユーティリティを多数提供します。コミュニティに優しいので、直面した問題やバグがあれば遠慮なく報告してください。
ほぼすべての関数 (インライン バージョン) とパラメーターは、対応するヘッダー内に文書化されています。
完全なドキュメント: http://cglm.readthedocs.io
glm_vec_dup -> glm_vec3_copyCGLM_FORCE_DEPTH_ZERO_TO_ONEおよびCGLM_FORCE_LEFT_HANDEDクリップスペースを制御するために提供されます。これで、Vulkan、DirectX、および Metal でcglm を使用できるようになります...https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s を参照してください。 オリジナルの GLM ライブラリをまだ知らない場合は、https://github.com/g-truc/glm も参照してください。
vec4変数とmat4変数は位置合わせする必要があります。 (後で調整されていないバージョンも登場する予定です) cglmヒープにメモリを割り当てません。したがって、アロケータは提供されません。メモリ位置のポインタを渡す場合は、 outパラメータにもメモリを割り当てる必要があります。 cglm はSIMD 命令を使用して、可能な場合はほとんどの操作を最適化するため、 vec4 (quat/ versorも) とmat4はアライメント (16 バイト) する必要があることを忘れないでください。
cglm はARRAY APIとSTRUCT API の両方をサポートしているため、struct api ( glms_ ) を利用すると構造体を返すことができます。
他のグラフィック ライブラリ (特に OpenGL) と同様に、このライブラリは列優先レイアウトを使用してメモリ内に行列を保持します。 将来的には、ライブラリは行優先レイアウトを使用するオプションをサポートする可能性がありますが、現在行優先レイアウトが必要な場合は、行優先レイアウトを転置する必要があります。 |
関数/操作を呼び出すには 2 つのオプションがあります: インライン呼び出しまたはライブラリ呼び出し (リンク) ほとんどすべての関数はインライン (always_inline) としてマークされているため、コンパイラはおそらくインライン化します。プリコンパイルされたバージョンを呼び出すには、 glm_の代わりにglmc_ (c は「call」の略) を使用します。
#include <cglm/cglm.h> /* for inline */
#include <cglm/call.h> /* for library call (this also includes cglm.h) */
mat4 rot , trans , rt ;
/* ... */
glm_mul ( trans , rot , rt ); /* inline */
glmc_mul ( trans , rot , rt ); /* call from library */ほとんどの数学関数は、利用可能な場合は SSE2 を使用して手動で最適化されますが、利用できない場合は?すべての操作には非 SSE バージョンがあるので心配しないでください。
アドレスを取得するのではなく、行列とベクトルを配列として関数に渡すことができます。
mat4 m = {
1 , 0 , 0 , 0 ,
0 , 1 , 0 , 0 ,
0 , 0 , 1 , 0 ,
0 , 0 , 0 , 1
};
glm_translate ( m , ( vec3 ){ 1.0f , 0.0f , 0.0f });ライブラリには汎用の mat4 mul 関数と inverse 関数が含まれており、アフィン変換の行列用にこれらの関数の特別な形式 (最適化された) もいくつか含まれています。 2 つのアフィン変換行列を乗算する場合は、glm_mat4_mul の代わりに glm_mul を使用し、glm_mat4_inv の代わりに glm_inv_tr (ROT + TR) を使用できます。
/* multiplication */
mat4 modelMat ;
glm_mul ( T , R , modelMat );
/* othonormal rot + tr matrix inverse (rigid-body) */
glm_inv_tr ( modelMat ); struct API は次のように動作します。型のs接尾辞、関数のglms_接頭辞、および定数のGLMS_接頭辞に注意してください。
#include <cglm/struct.h>
mat4s mat = GLMS_MAT4_IDENTITY_INIT ;
mat4s inv = glms_mat4_inv ( mat );構造体関数は通常、ポインターを取得してパラメーターを出力するのではなく、パラメーターを値として受け取り、その結果を返します。つまり、その気になれば、パラメータは通常constにすることができます。
実際に使用される型は、同じデータに複数の方法でアクセスできるようにする共用体です。それらの方法の 1 つは、C11 以降で使用できる匿名構造を使用します。 MSVC は初期の C バージョンでもサポートしており、 -fms-extensions有効にすると GCC/Clang でサポートされます。これらの匿名構造体を明示的に有効にするには、 #define CGLM_USE_ANONYMOUS_STRUCTを1に設定し、無効にするには #define CGLM_USE_ANONYMOUS_STRUCT を0に設定します。下位互換性を維持するために、 #define CGLM_NO_ANONYMOUS_STRUCT (値は無関係です) を使用して無効にすることもできます。明示的に指定しない場合、cglm はコンパイラと使用している C バージョンに基づいて最善の推測を実行します。
$ mkdir build
$ cd build
$ cmake .. # [Optional] -DCGLM_SHARED=ON
$ make
$ sudo make install # [Optional] option (CGLM_SHARED "Shared build" ON )
option (CGLM_STATIC "Static build" OFF )
option (CGLM_USE_C99 "" OFF ) # C11
option (CGLM_USE_TEST "Enable Tests" OFF ) # for make check - make test これには、cglm の構築やインストールは必要ありません。
cmake_minimum_required ( VERSION 3.8.2)
project (<Your Project Name >)
add_executable ( ${PROJECT_NAME} src/main.c)
target_link_libraries ( ${LIBRARY_NAME} PRIVATE
cglm_headers)
add_subdirectory (external/cglm/ EXCLUDE_FROM_ALL ) cmake_minimum_required ( VERSION 3.8.2)
project (<Your Project Name >)
add_executable ( ${PROJECT_NAME} src/main.c)
target_link_libraries ( ${LIBRARY_NAME} PRIVATE
cglm)
add_subdirectory (external/cglm/)
# or you can use find_package to configure cglm sinfなどの数学関数を使用するため、 wasm32-unknown-unknownを対象とすることはできず、wasi-sdk または emscripten のいずれかを使用する必要があります。
共有ビルドは WebAssembly ではまだサポートされていないことに注意してください。
simd128 をサポートするには、コマンド ライン-DCMAKE_C_FLAGS="-msimd128"でCMAKE_C_FLAGSに-msimd128を追加します。
テストの場合、cmake オプションCGLM_USE_TESTは引き続き機能します。テストを実行するには wasi ランタイムが必要です。詳細な例については、ci 構成ファイルを参照してください。
$ cmake ..
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0 /path/to/wasi-sdk-19.0/は、抽出された wasi SDK へのパスです。
この場合、デフォルトで静的ビルドが作成されます。
$ emcmake cmake ..
-DCMAKE_EXE_LINKER_FLAGS= " -s STANDALONE_WASM "
-DCGLM_STATIC=ONここでのemcmakeは、インストールされた emsdk からの Emscripten の cmake ラッパーです。
$ meson build # [Optional] --default-library=static
$ cd build
$ ninja
$ sudo ninja install # [Optional] c_std = c11
buildtype = release
default_library = shared
build_tests = true # to run tests: ninja test # Clone cglm or create a cglm.wrap under <source_root>/subprojects
project ( ' name ' , ' c ' )
cglm_dep = dependency ( ' cglm ' , fallback : ' cglm ' , ' cglm_dep ' )
executable ( ' exe ' , ' src/main.c ' , dependencies : cglm_dep)現在、デフォルトのビルド オプションのみがサポートされています。 cglm依存関係をプロジェクトに追加します。
...
Package (
...
dependencies : [
...
. package ( url : " https://github.com/recp/cglm " , . branch ( " master " ) ) ,
]
...
)次に、 cgml を依存関係としてターゲットに追加します。製品の選択肢は次のとおりです。
...
. target (
...
dependencies : [
...
. product ( name : " cglm " , package : " cglm " ) ,
]
...
)
...$ sh autogen.sh
$ ./configure
$ make
$ make check # [Optional]
$ [sudo] make install # [Optional]これにより、pkg-config ファイルもインストールされるため、 pkg-config --cflags cglmおよびpkg-config --libs cglm使用してコンパイラおよびリンカーのフラグを取得できるようになります。
ファイルは指定されたプレフィックス (通常、Linux ではデフォルトで/usr/local ) にインストールされますが、pkg-config は実際にそこをチェックするように構成されていない可能性があります。 pkg-config --variable pc_path pkg-config実行することでどこを探しているかを把握し、 ./configure --with-pkgconfigdir=/your/pathを介してファイルがインストールされるパスを変更できます。あるいは、プレフィックス パスをPKG_CONFIG_PATH環境変数に追加することもできます。
Windows 関連のビルド ファイルとプロジェクト ファイルはwinフォルダーにあります。cglm cglm/winフォルダー内にいることを確認してください。コード分析が有効になっているため、ビルドに時間がかかる場合があります。
$ cd win
$ . build.bat msbuild (複数バージョンの VS が原因で) 動作しない場合は、 devenvでビルドしてみてください。
$ devenv cglm.sln / Build Release同じ Visual Studio ソリューション ファイルでテスト プロジェクトを確認できます。テストを実行するには、そのプロジェクトを実行するだけで十分です。
まず Sphinx をインストールする必要があります: http://www.sphinx-doc.org/en/master/usage/installation.html 次に、次のようにします。
$ cd docs
$ sphinx-build source buildドキュメントをビルドフォルダーにコンパイルし、その関数内でindex.htmlを実行できます。
関数のインライン バージョンを使用する場合は、メイン ヘッダーをインクルードします。
#include <cglm/cglm.h>ヘッダーにはすべてのヘッダーが含まれます。次に、必要な関数を呼び出します。たとえば、軸ごとにベクトルを回転します。
glm_vec3_rotate ( v1 , glm_rad ( 45 ), ( vec3 ){ 1.0f , 0.0f , 0.0f });いくつかの関数はオーバーロードされています:) たとえば、ベクトルを正規化できます。
glm_vec3_normalize ( vec );これにより、vec が正規化され、正規化されたベクトルがvecに保存されますが、正規化されたベクトルを別のベクトルに保存する場合は、次のようにします。
glm_vec3_normalize_to ( vec , result );この関数のように、 _to postfix が表示される場合があります。この関数は結果を別の変数に保存し、一時メモリを節約します。
プリコンパイル済みバージョンを呼び出すには、 c接尾辞が付いたヘッダーが含まれます。c は呼び出しを意味します。プリコンパイル済みバージョンは単なるラッパーです。
#include <cglm/call.h>このヘッダーには、c 接尾辞が付いているすべてのヘッダーが含まれます。 c posfix を使用して関数を呼び出す必要があります。
glmc_vec3_normalize ( vec );関数の使用法とパラメーターは、関連するヘッダー内に文書化されています。次のような例では、同じパラメータが 2 回渡される場合があります。
glm_mat4_mul ( m1 , m2 , m1 );
/* or */
glm_mat4_mul ( m1 , m1 , m1 );最初の 2 つのパラメータは[in]パラメータで、最後のパラメータは[out]パラメータです。 m1とm2 を乗算した後、結果はm1に格納されます。これが、 m1 を2 回送信する理由です。結果を別の行列に保存することもできますが、これは単なる例です。
mat4 proj , view , model , mvp ;
/* init proj, view and model ... */
glm_mat4_mul ( proj , view , viewProj );
glm_mat4_mul ( viewProj , model , mvp ); mat4 proj , view , model , mvp ;
/* init proj, view and model ... */
glm_mat4_mulN (( mat4 * []){ & proj , & view , & model }, 3 , mvp );mat4 は vec4 の配列であり、vec4 は float の配列です。 glUniformMatrix4fv関数はfloat* value (最後のパラメーター) として受け入れるため、mat4 を float* にキャストすることも、行列の最初の列を行列のメモリの先頭として渡すこともできます。
オプション 1: 最初の列を送信する
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ]);
/* array of matrices */
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ][ 0 ]);オプション 2: 行列をポインター型にキャストする (多次元配列にも有効)
glUniformMatrix4fv ( location , 1 , GL_FALSE , ( float * ) matrix );同じ方法で他の API (Vulkan、DX など) に行列を渡すことができます。
TODO:
glm_umat4_mul ) このプロジェクトは、貢献してくださったすべての人々のおかげで存在します。 [貢献する]。
支援者の皆様、ありがとうございました! 【後援者になる】
スポンサーになってこのプロジェクトを支援してください。あなたのロゴが Web サイトへのリンクとともにここに表示されます。 【スポンサーになる】
マサチューセッツ工科大学。 LICENSEファイルを確認してください