scop (3D model viewer)

2026.04

C++とOpenGLで実装した3Dオブジェクトビューア

C++OpenGLGLSLGraphics

概要

C++とOpenGLで.obj形式の3Dモデルをリアルタイム描画するビューアを約2週間で開発した。 OBJパースから頂点データの構築、GPUへの転送、シェーダによる描画までのレンダリングパイプラインを、外部ライブラリ(GLM / stb_image / Assimp)を使用せずに実装し、描画処理の理解を目的として構築した。 また、ImGuiによるUIを導入し、モデル・テクスチャの切り替えや描画状態(テクスチャ・ライティング・UV)の制御をリアルタイムで行えるインタラクティブなビューアとした。 miniRTでレイトレーシングによるオフラインレンダリングを実装した経験を踏まえ、本プロジェクトではラスタライズによるリアルタイム描画パイプラインの理解と実装に取り組んだ。 機能一覧: • OBJモデル表示 • リアルタイム描画(OpenGL) • テクスチャマッピング(OBJ UV / 平面マッピング) • ワイヤーフレーム / ライティング / 法線ベクトル可視化トグル • キーボード・マウス入力

scop (3D model viewer)

担当範囲

  • OBJパーサー:v, vt, vn, f行の解析、fan triangulationによる三角形分割
  • 頂点バッファ構築:位置・色・UV(平面マッピング用 / OBJ UV)・法線の属性をVBOに格納
  • OpenGL描画:VAO / VBOの構築とGPUへの転送、描画パイプラインの実装
  • GLSLシェーダー:モデル描画用・法線可視化・軸ギズモ用の3種類のシェーダ実装
  • 数学ライブラリ(Vec3 / Vec4 / Mat4)の自作:座標変換・透視投影・カメラ行列の実装
  • BMPローダー:24/32bit対応、BGR→RGB変換、top-down BMP対応
  • テクスチャマッピング:OBJのUV適用と平面マッピング用の自動UV生成
  • 入力処理:キーボード・マウスによる回転・パン・ズーム操作
  • UI実装:ImGuiによるモデル・テクスチャ選択、描画状態切替、情報表示

ポイント

  • OpenGL/GLSLによるレンダリングパイプラインの構築
  • 行列演算を含む3D数学の実装
  • 複数テクスチャマッピング方式を統合したシェーダ

苦労・工夫した点

OBJファイルのテキストデータを描画可能な形式に変換するため、「モデルデータ → 頂点配列 → GPUバッファ → シェーダ処理」という処理フローを段階的に分離して実装した。CPU側で頂点データの生成と整形を行い、座標変換や描画処理をGPU(シェーダ)で行うことで、リアルタイム描画におけるCPU / GPUの役割分担を明確にした。 テクスチャマッピングでは、OBJ由来のUV座標と、UV情報を持たないモデルへの平面マッピング用のUV生成の2方式を実装した。 テクスチャ読み込みのためにBMPローダーを自作し、BMP特有のBGR配列やtop-down形式(負の高さ)による走査方向の違いを考慮し、OpenGLが扱うRGB順・ボトムアップ形式に変換した上でGPUへ転送している。このように、画像フォーマットとGPUのテクスチャ仕様の差異を吸収する処理を実装することで、レンダリングパイプラインの理解を深めた。 また、OBJパーサーと描画処理を分離し、「頂点データの構築」と「描画パイプライン」を独立した責務として設計。これにより、実装後半で追加した機能(テクスチャ切替やUI導入)を既存コードに影響を与えずに拡張することができた。