
CGエンジニア必携(本書はPDF書籍です)
CGアルゴリズム実装ハンドブック ― サンプルコードと共に学ぶ普遍的手法
CGソフト開発に必要な基礎から応用までを完全カバー。
動かして理解できるCGアルゴリズム解説書。
「理論と実装の両面から学ぶ普遍的なCG基礎技術。
全317本のサンプルプログラム、19個のコード片で、理論と実装の両輪を体得する。
■何が学べるか
CGソフト開発に必要な基礎アルゴリズムを、実装を通して体系的に習得できます。
市販のCGソフトに近い機能を、自らの手で構築する技術が身につきます。
普遍的な数理・アルゴリズムの理解により、DirectX以外の環境にも応用可能です。
サンプルコードと解説を体系的に整理した、実践的ハンドブックとしても活用できます。
■「はじめに」抜粋
本書は、私がこれまで歩んできた CGプログラミング人生の集大成 です。学生時代から現在に至るまで積み重ねてきた知識や技術、試行錯誤の末に得られた経験を、一冊の形にまとめたいと考え、執筆を始めました。せっかく身につけた技術を自分の中だけに留めておくのではなく、次の世代のエンジニアや研究者に伝え、活かしてもらいたい――そうした思いが執筆の動機となっています。
制作にはおよそ二年半を費やしました。最初の一年間は十分に時間を割くことができませんでしたが、それ以降は日々の生活の中で本書の執筆を中心に据え、技術的検証と執筆を重ねてようやく完成に至りました。
本書は、読者が 自分自身の力で 3DCG ソフトウェアを一から構築できる力を身につける ことを目標にしています。ここでいう 3DCG ソフトとは、3ds Max や Blender のような本格的な CG 制作ツールを指します。
近年では、完成度の高い市販ソフトやオープンソースソフトが誰でも手軽に利用できるため、ゼロから CG プログラムを自作する意義はかつてほど強くはないかもしれません。しかし、自分で仕組みを作れる力 を身につけておくことは、表面的な操作にとどまらず、内部の動きを理解し、応用力や問題解決力を高める上で非常に有益です。本書はまさに、その「作れる力」を育むことを目的としています。
描画には DirectX 12 を使用していますが、本書の本質はあくまでも アルゴリズムの解説 にあります。ここで紹介する幾何学的な処理や衝突判定の手法は、グラフィックスAPIがどのように進化・変化しようとも揺らぐことのない普遍的なものです。したがって本書で得た知識は DirectX 12 にとどまらず、今後のあらゆる開発環境において活用できるものとなるでしょう。
私自身、長年にわたり「アルゴリズムを理解すればCGは自分で作れる」という信念のもと学んできました。その到達点を一冊の形に結実させたのが本書です。この本が、読者の皆様にとって CGプログラミングを学ぶ道標となり、さらに自らのアイデアを形にするための確かな礎 となることを願っています。
なお、本書ではレイトレーシングやパストレーシングに関する章は当初予定していたものの、削除しています。理由は、筆者がすでに出版した『レイトレーシングGURU』および『レイトレーシングGURU2』で詳細な解説を行っており、そちらで十分に学べる内容であるためです。その分、本書ではジオメトリ作成・変換・交差判定・シーン操作など、3DCGソフトを自作する上で基礎かつ応用に直結する内容に集中しています。
本書を学ぶことで、読者はジオメトリや座標変換、衝突判定、シーン操作といった 3DCG の核心的な仕組みを理解し、自分自身で CG ソフトを作り上げるための基礎力を獲得できます。習熟度としては、章ごとのサンプルプログラムを実際に動かし、自分で改造・応用できるレベルを目指す構成となっています。
■目次
目次 5
- 序章 1
1.1. はじめに 2
1.2. サンプルプログラムの使い方 3
1.3. 開発環境の準備 6
1.4. bmathについて 8 - bmathの理由 9
1.5. 他のライブラリへの書き換え 10 - glmに書き換え 11
- dxmathに書き換え 14
- d3dxに書き換え 18
- ジオメトリ作成 23
2.1. トライアングル 24 - トライアングル作成 反時計回り 25
- トライアングル作成 時計回り 29
2.2. クアッド 31 - クアッド作成 反時計回り 32
- クアッド作成 時計回り 34
- クアッド作成インデックス 反時計回り 36
- クアッド作成インデックス 時計回り 39
2.3. ボックス 41 - ボックス作成 反時計回り 42
- ボックス作成 時計回り 45
- ボックス作成インデックス 反時計回り 47
- ボックス作成インデックス 時計回り 50
2.4. スフィア 52 - スフィア作成インデックス 反時計回り 53
- スフィア作成インデックス 時計回り 56
2.5. ティーポット 58 - ティーポット作成インデックス 反時計回り 59
- ローポリティーポット作成インデックス 反時計回り 62
- ティーポット作成インデックス 時計回り 64
- ローポリティーポット作成インデックス 時計回り 67
2.6. シリンダー 70 - シリンダー作成インデックス 反時計回り 71
- シリンダー作成インデックス 時計回り 74
2.7. 法線(面法線) 77 - 面法線計算 インデックスなしタイプ 78
- 頂点法線計算 インデックスタイプ 83
2.8. バウンディングボリューム 87 - バウンディングボックス 88
- バウンディングスフィア簡易 91
- バウンディングスフィア正確 94
- プロシージャルなジオメトリ作成 97
3.1. グリッド プロシージャル作成 98 - グリッド Z-up 左手系 99
- グリッド Z-up 右手系 103
- グリッド Y-up 左手系 107
- グリッド Y-up 右手系 110
3.2. N角形状 プロシージャル作成 113 - N角形状に頂点生成 114
- N角形をトライアングル群に 117
3.3. ボックス プロシージャル作成 121 - min maxから8頂点 122
3.4. スフィア プロシージャル作成 126 - 中心、半径から頂点群 127
3.5. シリンダー プロシージャル作成 130 - 角数と半径、長さから頂点群 131
3.6. ベジェ プロシージャル作成 135 - 2次ベジェ曲線 136
- 3次ベジェ曲線 140
- 3次ベジェ曲面 143
3.7. B-Spline 147 - B-Spline曲線 148
- B-Spline曲面 151
3.8. NURBS 158 - NURBS曲線 159
- NURBS曲面 166
- ジオメトリ選択、移動、変形 170
4.1. 基本変換 171 - スケーリング 172
- 回転 176
- 移動 179
- 変換を合成 182
- 任意軸回転 185
- 任意位置回転 188
- 任意位置かつ任意軸回転 191
4.2. マウス操作 194 - ポリゴン選択 195
- メッシュ選択 近似 199
- メッシュ選択 正確 203
- マウスドラッグ 207
- スナップ吸着 213
- ジオメトリの読み込み 216
5.1. STL 217 - STLファイルの読み込み アスキー形式 218
- STLファイルの読み込み バイナリ形式 224
5.2. PLY 228 - PLYファイルの読み込み 位置情報のみ使用 229
- PLYファイルの読み込み 位置と法線 233
5.3. OBJ 235 - OBJファイルの読み込み 位置と法線のみ 236
- OBJファイルの読み込み 位置、法線、マテリアル 241
- OBJファイルの読み込み 位置、法線、マテリアル、テクスチャー 245
5.4. GLTF 248 - GLTFファイルの読み込み 位置のみ 249
- GLTFファイルの読み込み 位置、法線 252
- GLTFファイルの読み込み 位置、法線、インデックス 255
- GLTFファイルの読み込み 位置、法線、インデックス、テクスチャー 262
5.5. FBX 268 - バージョンについて 269
- FBXファイルの読み込み 位置と法線のみ 270
- FBXファイルの読み込み 位置、法線、マテリアル 274
- FBXファイルの読み込み 位置、法線、マテリアル、テクスチャー 278
5.6. SKP 281 - 実行環境に関する注意事項 282
- SKPファイルの読み込み 位置のみ 283
- SKPファイルの読み込み 位置、法線 287
- SKPファイルの読み込み 位置、法線、テクスチャー 290
5.7. 3DM 293 - 3DMファイルの情報を取得 294
- 3DMファイルを開く 299
- 3DMからジオメトリ表示 303
- 画像読込み 306
6.1. bmp Bitmap Image File 307 - ビットマップ画像ファイルを読み込む 308
6.2. jpg Joint Photographic Experts Group 313 - JPEG画像ファイルを読み込む 314
6.3. png Portable Network Graphics 318 - PNG画像ファイルを読み込む 319
6.4. WebP Web Picture format 323 - WebP画像ファイルを読み込む 324
- ジオメトリ書きだし 328
7.1. シーンをDXFに出力 329 - ポリゴンをDXF(ポリゴン)にする 330
- ポリゴンをDXF(ライン)にする 334
- メッシュをDXF(ポリゴン)にする 338
- メッシュをDXF(ライン)にする 342
- メッシュをレイヤー分けしてDXF(ポリゴン)にする 346
- メッシュをレイヤー分けしてDXF(ライン)にする 352
- メッシュをブロック分けしてDXF(ポリゴン)にする 358
- メッシュをブロック分けしてDXF(ライン)にする 362
- メッシュをレイヤー分けブロック分けしてDXF(ポリゴン)にする 366
- メッシュをレイヤー分けブロック分けしてDXF(ライン)にする 371
- レンダリングパイプライン 376
8.1. 右手系と左手系 377 - 右手系と左手系の違い 378
- 左手系、右手系の実際例 380
- どこで混乱が起こりやすいか 382
- グラフィックスAPIはどちらでもいい 383
8.2. 各種変換行列の作り方 384 - ベクトルを移動するのか、それとも系を移動するのか 385
- スケーリング行列、回転行列の作り方 386
- 移動行列の作り方 391
- ワールド行列の作り方 392
- ビュー行列の作り方 399
- プロジェクション行列の作り方 410
- ビューポートスケーリング行列の作り方 440
8.3. パイプライン内、座標の変遷 444 - 座標変遷の流れ 445
- どのシェーダーでどの変換が行われるか 448
- サンプルプログラムで実際に確認 453
- 計算を始める前に 456
- 実際に計算していこう! 第1段階 ワールド変換 457
- 実際に計算していこう! 第2段階 ビュー変換 458
- 実際に計算していこう! 第3段階 プロジェクション変換 459
- 実際に計算していこう! 第4段階 クリッピング 460
- 実際に計算していこう! 第5段階 ビューポート・スケール変換 461
- 実際に計算していこう! 第6段階 パースペクティブ・デバイド 462
8.4. 座標変換の誤差と注意点 464 - 数値誤差の発生要因 465
- 対策と注意点 466
- シーン操作(カメラ) 468
9.1. 回転 469 - 扱いやすいカメラ回転(マウスドラッグで回転) 470
- 物体の周りで回転 475
9.2. WASD 482 - WASD 483
- WASDRF 490
- WASDRF+回転 495
9.3. ズーム 501 - プロジェクションでズーム 502
- 視点を動かしてズーム 507
9.4. フィット 512 - 画面を物体にフィットさせる 513
- 画面をシーン全体にフィットさせる 517
- シーン操作(マウス) 522
10.1. マウスポインターの座標を得る 523 - マウスポインターのスクリーン座標 524
- マウスポインターのワールド座標 528
10.2. マウスで物体移動 531 - マウスドラッグ量をワールド移動量に 532
- 交差判定 537
11.1. 重要事項 538 - 直線、半直線、線分の違い 539
- 2Dサンプルでもベクトルは全て3次元ベクトル 541
- 論理上の頂点オーダーとSTLファイルの違い 542
- 面積で判定(線分、線分) 550
- SATを理解 566
- スラブ法を理解 576
11.2. 2D平面における判定 592 - 直線、直線 593
- 直線、半直線 597
- 直線、線分 600
- 直線、三角形 603
- 直線、四角形 607
- 直線、円 609
- 直線、AABB 614
- 直線、OBB 617
- 半直線、半直線 619
- 半直線、線分 622
- 半直線、三角形 625
- 半直線、四角形 628
- 半直線、円 630
- 半直線、AABB 637
- 半直線、OBB 640
- 線分、線分 643
- 線分、三角形 646
- 線分、四角形 655
- 線分、円 658
- 線分、AABB 面積法 662
- 線分、OBB 面積法 663
- 線分、AABB SAT 664
- 線分、OBB SAT 665
- 線分、AABB スラブ法 666
- 線分、OBB スラブ法 669
- 三角形、三角形 671
- 三角形、四角形 675
- 三角形、円 678
- 三角形、AABB 面積法 681
- 三角形、OBB 面積法 682
- 三角形、AABB SAT 683
- 三角形、OBB SAT 684
- 三角形、AABB スラブ法 685
- 三角形、OBB スラブ法 686
- 四角形、四角形 687
- 四角形、円 691
- 四角形、AABB 面積法 694
- 四角形、OBB 面積法 695
- 四角形、AABB SAT 696
- 四角形、OBB SAT 697
- 四角形、AABB スラブ法 698
- 四角形、OBB スラブ法 699
- 円、円 700
- 円、AABB 703
- 円、OBB 705
- AABB、AABB 708
- AABB、OBB 710
- OBB、OBB 713
11.3. 3D空間における判定 719 - Möller and Trumbore法を理解 720
- 直線、直線 727
- 直線、半直線 734
- 直線、線分 738
- 直線、平面 743
- 直線、三角形 747
- 直線、四角形 752
- 直線、円 754
- 直線、球 756
- 直線、AABB 759
- 直線、OBB 761
- 半直線、半直線 763
- 半直線、線分 767
- 半直線、平面 771
- 半直線、三角形 773
- 半直線、四角形 775
- 半直線、円 777
- 半直線、球 779
- 半直線、AABB 782
- 半直線、OBB 784
- 線分、線分 787
- 線分、平面 789
- 線分、三角形 791
- 線分、四角形 794
- 線分、円 798
- 線分、球 802
- 線分、AABB SAT 807
- 線分、OBB SAT 811
- 線分、AABB スラブ法 814
- 線分、OBB スラブ法 817
- 平面、平面 819
- 平面、三角形 826
- 平面、四角形 831
- 平面、円 833
- 平面、球 836
- 平面、AABB 838
- 平面、OBB 841
- 三角形、三角形 843
- 三角形、四角形 846
- 三角形、円 849
- 三角形、球 856
- 三角形、AABB スラブ法 860
- 三角形、AABB SAT 863
- 三角形、OBB スラブ法 866
- 三角形、OBB SAT 869
- 四角形、四角形 872
- 四角形、円 875
- 四角形、球 878
- 四角形、AABB スラブ法 881
- 四角形、AABB SAT 884
- AABB、AABB 887
- 四角形、OBB スラブ法 889
- 四角形、OBB SAT 891
- 円、円 894
- 円、球 897
- 円、AABB 899
- 円、OBB 902
- 球、球 905
- 球、AABB 907
- 球、OBB 909
- AABB、OBB 911
- OBB、OBB 913
- 頻繁に行う計算 917
12.1. 距離 918 - 点と点の距離 919
- 点と直線の距離 922
- 直線と直線の距離 926
- 点と平面の距離 930
12.2. 角度 933 - ベクトル間の角度 934
- 平面同士の角度 937
12.3. 図形要素を算出 940 - 辺を作る 941
- 2点から直線方程式(ベクトル) 944
- 垂直なベクトルを作る 945
- 垂直なベクトルを作る 成分入れ替えで 946
- 平面方程式 948
- 三角形の内接円の中心(内心) 949
- 三角形の外接円の中心(外心) 951
- 三角形の回転中心(重心) 953
- OBBをAABBに 954
12.4. 内外判断 955 - 点が円の内部かどうか 956
- 点が三角形の内部か 957
- 点が球の内部か 960
- 線分が面のどちら側か 962
- 2つのベクトルが同方向か 964
12.5. 反射、滑り 966 - ベクトルを反射させる 967
- ベクトルを角度で曲げる 968
- ベクトルを壁で滑らせる 970
12.6. 3D変換と逆変換 972 - Project 3D空間座標をスクリーン座標に 973
- Unproject スクリーン座標をワールド座標に 975
- デバッグ 977
13.1. デバッグ情報出力 978 - コンソール表示 979
- コンソール表示 サイズ、色指定 981
- コンソール表示 位置指定 984
- コンソール表示 フォント指定 986
- ログ出力 989
- VisualStudioの出力ウィンドウに表示 991
13.2. 速度計測 994 - 高精度時間計測 995
13.3. モック / スタブ 997 - モック / スタブ 998
13.4. 差分デバッグ 1000 - 差分デバッグ 1001
13.5. 逐次実行 1003 - 逐次実行 1004
13.6. 分割統治 1007 - 分割統治 1008
- その他サンプルプログラム 1010
- 各種一覧表 1012
15.1. 度数からラジアン 1013
15.2. 物質中の光の屈折率 1020
15.3. 物質の反射率 1022
15.4. 物質の反射強度一覧(鏡面/拡散) 1024
15.5. 光透過率 1026
15.6. 左手系、右手系、行優先、列優先 組み合わせごとの演算順序 1028
15.7. 三角関数値表 主要角度のみ 1029
15.8. 一般的モニター解像度一覧 1030
15.9. 携帯・小型デバイス向け 1031
15.10. 回転行列 / クォータニオン変換表 1032 - 著者紹介 1034
■ページ外観




■サンプル外観






■著者について

鎌田 BAREPIXEL株式会社 代表取締役
1966年 北海道生まれ。
1982年3月 中学卒業時にNational JR-100購入。初めてのパソコン。
1983年 SHARP X1を購入。
1984年 自作ゲームがoh MZ誌に掲載(高校2年時)。Oh MZ誌表紙、巻頭ページ、目次、掲載ページ
1985年-1986年 高校在学中に札幌のゲーム会社にて、ゲーム移植を請負契約にて行う。
1992年10月 北海道空知支庁入庁(一般職)。
1999年6月 北海道職員を退職。ゲーム開発の研究と開発を開始。
2年後に市販ゲームを個人で完成。その後ゲーム関連の技術書を執筆しながら、3校の専門学校でゲームプログラミング、情報処理、ゲーム3DCGの非常勤講師を同時に兼任。
2009年に個人事業Northbrainを開始。
2014年2月、自身2作目の商業ゲーム「FALL」(STEAM GREENLIGHT通過作品)を完成。
2014年9月、3作目のゲームとしてアンドロイドゲーム「COMBOLL」を完成。完全ネイティブ(NDK)でフルスクラッチにより作成。
2019年4月、ベアピクセル株式会社を設立。
現在に至る。
■一言メッセージ
難しいことも多いけれど、順を追って一緒に学んでいきましょう。
■発売日
2025年10月20日(月)
■価格
8,300円+消費税

ご購入リンク
本書は電子書籍です
本書はPDFというデジタルファイルになります。本書の閲覧はパソコン、ノートパソコンはもちろん、タブレット端末、電子書籍リーダー(カラーPDFが閲覧可能なもの)、その他カラーPDF電子書籍が閲覧可能なデバイスで可能です。
セキュリティについて
パスワード
セキュリティの理由により、本書を開く際には、パスワードの入力が必要になります。
パスワードはご購入されたときに入力したメールアドレスになります。

透かし
本書のページ下部に、ご購入者の氏名で”透かし”が入ります。これは無断複製の抑止力のための措置です。
(その氏名での透かしは、もちろんそのご購入者様の電子書籍だけに入ります。)

内容のコピー、印刷について
本書のテキスト及び図表はコピーできません。また本書は印刷できません。
また、内容をコピーあるいは印刷するような改造はしないでください。
決済後のダウンロード
ご 決済時に入力されたメールアドレス宛てに、決済後12時間以内にダウンロード先のURLを記入したメールを送信いたします。メール受信後その URLに行き、電子書籍(PDFファイル)をダウンロードしてください。ダウンロードできる期間は2週間となります。(通常、ダウンロードは1回で済みま す。
閲覧の度にダウンロードが必要なわけではありません)