CGエンジニア必携(本書はPDF書籍です)

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.1. はじめに 2
    1.2. サンプルプログラムの使い方 3
    1.3. 開発環境の準備 6
    1.4. bmathについて 8
  2. bmathの理由 9
    1.5. 他のライブラリへの書き換え 10
  3. glmに書き換え 11
  4. dxmathに書き換え 14
  5. d3dxに書き換え 18
  6. ジオメトリ作成 23
    2.1. トライアングル 24
  7. トライアングル作成 反時計回り 25
  8. トライアングル作成 時計回り 29
    2.2. クアッド 31
  9. クアッド作成 反時計回り 32
  10. クアッド作成 時計回り 34
  11. クアッド作成インデックス 反時計回り 36
  12. クアッド作成インデックス 時計回り 39
    2.3. ボックス 41
  13. ボックス作成 反時計回り 42
  14. ボックス作成 時計回り 45
  15. ボックス作成インデックス 反時計回り 47
  16. ボックス作成インデックス 時計回り 50
    2.4. スフィア 52
  17. スフィア作成インデックス 反時計回り 53
  18. スフィア作成インデックス 時計回り 56
    2.5. ティーポット 58
  19. ティーポット作成インデックス 反時計回り 59
  20. ローポリティーポット作成インデックス 反時計回り 62
  21. ティーポット作成インデックス 時計回り 64
  22. ローポリティーポット作成インデックス 時計回り 67
    2.6. シリンダー 70
  23. シリンダー作成インデックス 反時計回り 71
  24. シリンダー作成インデックス 時計回り 74
    2.7. 法線(面法線) 77
  25. 面法線計算 インデックスなしタイプ 78
  26. 頂点法線計算 インデックスタイプ 83
    2.8. バウンディングボリューム 87
  27. バウンディングボックス 88
  28. バウンディングスフィア簡易 91
  29. バウンディングスフィア正確 94
  30. プロシージャルなジオメトリ作成 97
    3.1. グリッド プロシージャル作成 98
  31. グリッド Z-up 左手系 99
  32. グリッド Z-up 右手系 103
  33. グリッド Y-up 左手系 107
  34. グリッド Y-up 右手系 110
    3.2. N角形状 プロシージャル作成 113
  35. N角形状に頂点生成 114
  36. N角形をトライアングル群に 117
    3.3. ボックス プロシージャル作成 121
  37. min maxから8頂点 122
    3.4. スフィア プロシージャル作成 126
  38. 中心、半径から頂点群 127
    3.5. シリンダー プロシージャル作成 130
  39. 角数と半径、長さから頂点群 131
    3.6. ベジェ プロシージャル作成 135
  40. 2次ベジェ曲線 136
  41. 3次ベジェ曲線 140
  42. 3次ベジェ曲面 143
    3.7. B-Spline 147
  43. B-Spline曲線 148
  44. B-Spline曲面 151
    3.8. NURBS 158
  45. NURBS曲線 159
  46. NURBS曲面 166
  47. ジオメトリ選択、移動、変形 170
    4.1. 基本変換 171
  48. スケーリング 172
  49. 回転 176
  50. 移動 179
  51. 変換を合成 182
  52. 任意軸回転 185
  53. 任意位置回転 188
  54. 任意位置かつ任意軸回転 191
    4.2. マウス操作 194
  55. ポリゴン選択 195
  56. メッシュ選択 近似 199
  57. メッシュ選択 正確 203
  58. マウスドラッグ 207
  59. スナップ吸着 213
  60. ジオメトリの読み込み 216
    5.1. STL 217
  61. STLファイルの読み込み アスキー形式 218
  62. STLファイルの読み込み バイナリ形式 224
    5.2. PLY 228
  63. PLYファイルの読み込み 位置情報のみ使用 229
  64. PLYファイルの読み込み 位置と法線 233
    5.3. OBJ 235
  65. OBJファイルの読み込み 位置と法線のみ 236
  66. OBJファイルの読み込み 位置、法線、マテリアル 241
  67. OBJファイルの読み込み 位置、法線、マテリアル、テクスチャー 245
    5.4. GLTF 248
  68. GLTFファイルの読み込み 位置のみ 249
  69. GLTFファイルの読み込み 位置、法線 252
  70. GLTFファイルの読み込み 位置、法線、インデックス 255
  71. GLTFファイルの読み込み 位置、法線、インデックス、テクスチャー 262
    5.5. FBX 268
  72. バージョンについて 269
  73. FBXファイルの読み込み 位置と法線のみ 270
  74. FBXファイルの読み込み 位置、法線、マテリアル 274
  75. FBXファイルの読み込み 位置、法線、マテリアル、テクスチャー 278
    5.6. SKP 281
  76. 実行環境に関する注意事項 282
  77. SKPファイルの読み込み 位置のみ 283
  78. SKPファイルの読み込み 位置、法線 287
  79. SKPファイルの読み込み 位置、法線、テクスチャー 290
    5.7. 3DM 293
  80. 3DMファイルの情報を取得 294
  81. 3DMファイルを開く 299
  82. 3DMからジオメトリ表示 303
  83. 画像読込み 306
    6.1. bmp Bitmap Image File 307
  84. ビットマップ画像ファイルを読み込む 308
    6.2. jpg Joint Photographic Experts Group 313
  85. JPEG画像ファイルを読み込む 314
    6.3. png Portable Network Graphics 318
  86. PNG画像ファイルを読み込む 319
    6.4. WebP Web Picture format 323
  87. WebP画像ファイルを読み込む 324
  88. ジオメトリ書きだし 328
    7.1. シーンをDXFに出力 329
  89. ポリゴンをDXF(ポリゴン)にする 330
  90. ポリゴンをDXF(ライン)にする 334
  91. メッシュをDXF(ポリゴン)にする 338
  92. メッシュをDXF(ライン)にする 342
  93. メッシュをレイヤー分けしてDXF(ポリゴン)にする 346
  94. メッシュをレイヤー分けしてDXF(ライン)にする 352
  95. メッシュをブロック分けしてDXF(ポリゴン)にする 358
  96. メッシュをブロック分けしてDXF(ライン)にする 362
  97. メッシュをレイヤー分けブロック分けしてDXF(ポリゴン)にする 366
  98. メッシュをレイヤー分けブロック分けしてDXF(ライン)にする 371
  99. レンダリングパイプライン 376
    8.1. 右手系と左手系 377
  100. 右手系と左手系の違い 378
  101. 左手系、右手系の実際例 380
  102. どこで混乱が起こりやすいか 382
  103. グラフィックスAPIはどちらでもいい 383
    8.2. 各種変換行列の作り方 384
  104. ベクトルを移動するのか、それとも系を移動するのか 385
  105. スケーリング行列、回転行列の作り方 386
  106. 移動行列の作り方 391
  107. ワールド行列の作り方 392
  108. ビュー行列の作り方 399
  109. プロジェクション行列の作り方 410
  110. ビューポートスケーリング行列の作り方 440
    8.3. パイプライン内、座標の変遷 444
  111. 座標変遷の流れ 445
  112. どのシェーダーでどの変換が行われるか 448
  113. サンプルプログラムで実際に確認 453
  114. 計算を始める前に 456
  115. 実際に計算していこう! 第1段階 ワールド変換 457
  116. 実際に計算していこう! 第2段階 ビュー変換 458
  117. 実際に計算していこう! 第3段階 プロジェクション変換 459
  118. 実際に計算していこう! 第4段階 クリッピング 460
  119. 実際に計算していこう! 第5段階 ビューポート・スケール変換 461
  120. 実際に計算していこう! 第6段階 パースペクティブ・デバイド 462
    8.4. 座標変換の誤差と注意点 464
  121. 数値誤差の発生要因 465
  122. 対策と注意点 466
  123. シーン操作(カメラ) 468
    9.1. 回転 469
  124. 扱いやすいカメラ回転(マウスドラッグで回転) 470
  125. 物体の周りで回転 475
    9.2. WASD 482
  126. WASD 483
  127. WASDRF 490
  128. WASDRF+回転 495
    9.3. ズーム 501
  129. プロジェクションでズーム 502
  130. 視点を動かしてズーム 507
    9.4. フィット 512
  131. 画面を物体にフィットさせる 513
  132. 画面をシーン全体にフィットさせる 517
  133. シーン操作(マウス) 522
    10.1. マウスポインターの座標を得る 523
  134. マウスポインターのスクリーン座標 524
  135. マウスポインターのワールド座標 528
    10.2. マウスで物体移動 531
  136. マウスドラッグ量をワールド移動量に 532
  137. 交差判定 537
    11.1. 重要事項 538
  138. 直線、半直線、線分の違い 539
  139. 2Dサンプルでもベクトルは全て3次元ベクトル 541
  140. 論理上の頂点オーダーとSTLファイルの違い 542
  141. 面積で判定(線分、線分) 550
  142. SATを理解 566
  143. スラブ法を理解 576
    11.2. 2D平面における判定 592
  144. 直線、直線 593
  145. 直線、半直線 597
  146. 直線、線分 600
  147. 直線、三角形 603
  148. 直線、四角形 607
  149. 直線、円 609
  150. 直線、AABB 614
  151. 直線、OBB 617
  152. 半直線、半直線 619
  153. 半直線、線分 622
  154. 半直線、三角形 625
  155. 半直線、四角形 628
  156. 半直線、円 630
  157. 半直線、AABB 637
  158. 半直線、OBB 640
  159. 線分、線分 643
  160. 線分、三角形 646
  161. 線分、四角形 655
  162. 線分、円 658
  163. 線分、AABB 面積法 662
  164. 線分、OBB 面積法 663
  165. 線分、AABB SAT 664
  166. 線分、OBB SAT 665
  167. 線分、AABB スラブ法 666
  168. 線分、OBB スラブ法 669
  169. 三角形、三角形 671
  170. 三角形、四角形 675
  171. 三角形、円 678
  172. 三角形、AABB 面積法 681
  173. 三角形、OBB 面積法 682
  174. 三角形、AABB SAT 683
  175. 三角形、OBB SAT 684
  176. 三角形、AABB スラブ法 685
  177. 三角形、OBB スラブ法 686
  178. 四角形、四角形 687
  179. 四角形、円 691
  180. 四角形、AABB 面積法 694
  181. 四角形、OBB 面積法 695
  182. 四角形、AABB SAT 696
  183. 四角形、OBB SAT 697
  184. 四角形、AABB スラブ法 698
  185. 四角形、OBB スラブ法 699
  186. 円、円 700
  187. 円、AABB 703
  188. 円、OBB 705
  189. AABB、AABB 708
  190. AABB、OBB 710
  191. OBB、OBB 713
    11.3. 3D空間における判定 719
  192. Möller and Trumbore法を理解 720
  193. 直線、直線 727
  194. 直線、半直線 734
  195. 直線、線分 738
  196. 直線、平面 743
  197. 直線、三角形 747
  198. 直線、四角形 752
  199. 直線、円 754
  200. 直線、球 756
  201. 直線、AABB 759
  202. 直線、OBB 761
  203. 半直線、半直線 763
  204. 半直線、線分 767
  205. 半直線、平面 771
  206. 半直線、三角形 773
  207. 半直線、四角形 775
  208. 半直線、円 777
  209. 半直線、球 779
  210. 半直線、AABB 782
  211. 半直線、OBB 784
  212. 線分、線分 787
  213. 線分、平面 789
  214. 線分、三角形 791
  215. 線分、四角形 794
  216. 線分、円 798
  217. 線分、球 802
  218. 線分、AABB SAT 807
  219. 線分、OBB SAT 811
  220. 線分、AABB スラブ法 814
  221. 線分、OBB スラブ法 817
  222. 平面、平面 819
  223. 平面、三角形 826
  224. 平面、四角形 831
  225. 平面、円 833
  226. 平面、球 836
  227. 平面、AABB 838
  228. 平面、OBB 841
  229. 三角形、三角形 843
  230. 三角形、四角形 846
  231. 三角形、円 849
  232. 三角形、球 856
  233. 三角形、AABB スラブ法 860
  234. 三角形、AABB SAT 863
  235. 三角形、OBB スラブ法 866
  236. 三角形、OBB SAT 869
  237. 四角形、四角形 872
  238. 四角形、円 875
  239. 四角形、球 878
  240. 四角形、AABB スラブ法 881
  241. 四角形、AABB SAT 884
  242. AABB、AABB 887
  243. 四角形、OBB スラブ法 889
  244. 四角形、OBB SAT 891
  245. 円、円 894
  246. 円、球 897
  247. 円、AABB 899
  248. 円、OBB 902
  249. 球、球 905
  250. 球、AABB 907
  251. 球、OBB 909
  252. AABB、OBB 911
  253. OBB、OBB 913
  254. 頻繁に行う計算 917
    12.1. 距離 918
  255. 点と点の距離 919
  256. 点と直線の距離 922
  257. 直線と直線の距離 926
  258. 点と平面の距離 930
    12.2. 角度 933
  259. ベクトル間の角度 934
  260. 平面同士の角度 937
    12.3. 図形要素を算出 940
  261. 辺を作る 941
  262. 2点から直線方程式(ベクトル) 944
  263. 垂直なベクトルを作る 945
  264. 垂直なベクトルを作る 成分入れ替えで 946
  265. 平面方程式 948
  266. 三角形の内接円の中心(内心) 949
  267. 三角形の外接円の中心(外心) 951
  268. 三角形の回転中心(重心) 953
  269. OBBをAABBに 954
    12.4. 内外判断 955
  270. 点が円の内部かどうか 956
  271. 点が三角形の内部か 957
  272. 点が球の内部か 960
  273. 線分が面のどちら側か 962
  274. 2つのベクトルが同方向か 964
    12.5. 反射、滑り 966
  275. ベクトルを反射させる 967
  276. ベクトルを角度で曲げる 968
  277. ベクトルを壁で滑らせる 970
    12.6. 3D変換と逆変換 972
  278. Project 3D空間座標をスクリーン座標に 973
  279. Unproject スクリーン座標をワールド座標に 975
  280. デバッグ 977
    13.1. デバッグ情報出力 978
  281. コンソール表示 979
  282. コンソール表示 サイズ、色指定 981
  283. コンソール表示 位置指定 984
  284. コンソール表示 フォント指定 986
  285. ログ出力 989
  286. VisualStudioの出力ウィンドウに表示 991
    13.2. 速度計測 994
  287. 高精度時間計測 995
    13.3. モック / スタブ 997
  288. モック / スタブ 998
    13.4. 差分デバッグ 1000
  289. 差分デバッグ 1001
    13.5. 逐次実行 1003
  290. 逐次実行 1004
    13.6. 分割統治 1007
  291. 分割統治 1008
  292. その他サンプルプログラム 1010
  293. 各種一覧表 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
  294. 著者紹介 1034

■ページ外観

■サンプル外観

STLファイル読み込み
画像読み込み
スフィアを作成
マウスで3D物体を選択
NURBS局面を作成
グリッド(と座標軸)を作成

■著者について

鎌田 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電子書籍が閲覧可能なデバイスで可能です。

セキュリティについて

パスワード

セキュリティの理由により、本書を開く際には、パスワードの入力が必要になります。
パスワードはご購入されたときに入力したメールアドレスになります。

Hikkei_EBook_Pass

透かし

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

Hikkei_EBook_WaterMark

内容のコピー、印刷について

本書のテキスト及び図表はコピーできません。また本書は印刷できません
また、内容をコピーあるいは印刷するような改造はしないでください。

決済後のダウンロード

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