私はSLAMの研究に従事しており、3D点群データなど大規模な3Dオブジェクトを効率的に可視化する必要があるため、自分のニーズを満たすために可視化ライブラリ「q3dviewer」を開発しました。
せっかく作ったので、オープンソース化(MITライセンス)してみました!本記事では「q3dviewer」の活用例を交えながら、使い方を紹介します。多くの方に利用していただけると嬉しいです。
q3dviewerとは
q3dviewerは、3Dビューアを迅速に開発するためのライブラリです。3Dオブジェクト(例えば、点群、カメラ、3Dガウス)を表示するためのアイテムを組み合わせることで、さまざまなビューアをすばやく開発できます。利用例として、cloud_viewer、film_makerなどのとても便利なツールも同梱しています。
特徴
- 効率的な3Dレンダリング:点群など大規模な3Dデータを効率的に表示可能
- 豊富な設定:3Dデータを動的に調整するためのGUIがあり、データを美しく表示可能
- 簡単に拡張:カスタマイズビューアを迅速に開発、独自のオブジェクトの表示も拡張可能
インストール方法
LinuxまたはWindowsの端末で、以下のコマンドを実行するだけでq3dviewerをインストールできます:
ライブラリのみ使用する場合(GUIツールを使わない):
pip install q3dviewer
GUIツールも使用する場合(cloud_viewer, film_maker など):
pip install "q3dviewer[tools]"
Python 3.12以上でGUIツールのみ使用する場合:
pipx install "q3dviewer[tools]"
pipx ensurepath
source ~/.bashrc
Windowsでの注意点
- Python 3の環境を事前に準備してください:
- Python公式サイトからPython 3をダウンロードしてインストールします。
- インストール時に「Add Python to PATH」にチェックを入れることを忘れないでください。
Liunxの注意点:
Ubuntu 20.04または22.04で共有ライブラリlibxcb-cursor.so.0の読み込みに関するエラーが発生した場合は、libxcb-cursor0をインストールしてください。
sudo apt-get install libxcb-cursor0
ツール類
インストール後、以下のツールを直接に使用できます。
1. Cloud Viewer
点群ファイル(LAS、PCD、PLY、E57),メッシュファイル(STL)の可視化ツールです。以下のコマンドで起動できます。
cloud_viewer # これだけで、viewerが表示される
python3 -m q3dviewer.tools.cloud_viewer #コマンドが長くて、おすすめしませんが、PATHがとおらないとき
Viewerが起動したら、ウィンドウ上にファイルをドラッグ&ドロップすることで点群を表示できます。複数のファイルを同時にドロップすることも可能です。
基本操作
- 📁 ファイルの読み込み:ファイルをドラッグ&ドロップしてビューアに読み込む
- 点群データ:.pcd, .ply, .las, .e57
- メッシュデータ:.stl
- 📏 距離の計測:選択された点の距離測定
- Ctrl + 左クリック:計測点を追加
- Ctrl + 右クリック:最後の点を削除
- 合計距離は自動的に表示されます
- 🎥 カメラ操作
- ダブルクリック:クリックした点をカメラの中心に設定
- 右ドラッグ:ビューを回転
- 左ドラッグ:ビューをパン(平行移動)
- マウスホイール:ズームイン/アウト
- ⚙️ 設定:‘M’キーを押して設定ウィンドウを開く
例えば、東京都のLAS形式点群をダウンロードして確認できます。
1.2.4以降、STLファイルも可視化可能になりました。
(中之島図書館)

キーボードMを押すと、メニューが画面に表示され、いろんな可視化設定を変更できます。点群の形状、サイズ、色、透明度など、さまざまな設定が可能ですので、ぜひ試してみてください。
2. ROS Viewer
ROSとの親和性が高く、RVIZの代わりに、高性能なSLAMビューアとして使用できます。
roscore &
ros_viewer
以下の動画は、私が開発したF4-SLAM(F3-SLAMのバージョンアップ)のROS Viewerです。SLAMから点群を受け取りながら、リアルタイム的に点群を表示します。LiDARの点群を2D画像に投影した様子も可視化しています。
仕事で開発したF4-SLAMを大阪市中央公会堂周辺で動作させ、きれいな点群地図を作成する様子です。
— Liu Yang (@scomup) March 18, 2025
技術の詳細については、今日のロボシンで紹介しますので、興味がありましたらぜひお聞きください。 pic.twitter.com/bINhN3UY3s
YouTubeの設定で1080pで再生していただくと高精細な映像でご覧いただけます!
とてもキレイな点群地図を作成していますね。F4-SLAMも近くの将来に紹介する予定ですので、ぜひお楽しみにしてください。
3. Film Maker
3D点群などの動画を作成する際、手動でカメラの視点を動かすことがよくありますが、その動作が不規則で美しくないです。そこで、film_makerをお試しください。
簡単なGUIを使っていくつかのキーフレームを設定することで、スムーズな補完を自動で行い、美しい点群動画を作成できます。
以下のコマンドで起動できます。
film_maker
基本操作
- ファイルのロード&視点移動:Cloud_Viewerと同じ
-
Spaceキー:キーフレームを追加 -
Deleteキー:キーフレームを削除 - Playボタン:動画の自動再生(再度押すと再生終了)
- Recordチェックボックス:チェックした状態で動作を再生すると、自動で録画
京橋駅周辺三次元点群データを使用して、Film Makerで動画を作成する様子
4. Gaussian Viewer
以前の記事で紹介された3D Gaussianの簡易ビューアです。
gaussian_viewer # drag and drop your gaussian file to windows
5. LiDAR Calibration Tools
2つのLiDARの相対姿勢を計算するツールです。相対姿勢を手動で調整したり、自動キャリブレーションを行うことも可能です。
lidar_calib --lidar0=/YOUR_LIDAR0_TOPIC --lidar1=/YOUR_LIDAR1_TOPIC
6. Lidar Camera Calibration Tools
LiDARとカメラの相対姿勢を計算するツールです。相対姿勢を手動で調整し、リアルタイムでLiDARの点を画像に投影する結果を確認できます。
lidar_cam_calib --lidar=/YOUR_LIDAR_TOPIC --camera=/YOUR_CAMERA_TOPIC --camera_info=/YOUR_CAMERA_INFO_TOPIC
ライブラリとしての使用
「q3dviewer」を使って独自の3Dビューアを簡単にカスタマイズ開発できます。以下はコーディング例です。
カスタマイズ3Dビューア
#!/usr/bin/env python3
import q3dviewer as q3d # q3dviewerをimportする
def main():
# Qtアプリケーションの作成
app = q3d.QApplication([])
# 各種3Dアイテムの作成
axis_item = q3d.GLAxisItem(size=0.5, width=5)
grid_item = q3d.GridItem(size=10, spacing=1)
# ビューアの作成
viewer = q3d.Viewer(name='example')
# ビューアにアイテムを追加
viewer.add_items({
'grid': grid_item,
'axis': axis_item,
})
# ビューアの表示 & Qtアプリケーションの実行
viewer.show()
app.exec_()
if __name__ == '__main__':
main()
q3dviewerには、以下の3Dアイテムが提供されています。
- AxisItem: 座標軸、または自己位置の表示
- CloudItem: 点群の表示
- CloudIOItem: IO機能付きの点群表示
- GaussianItem: 3Dガウスの表示
- GridItem: グリッドの表示
- ImageItem: 2Dイメージの表示
- Text2DItem: 2Dテキストの表示
- LineItem: 線(ロボット軌跡など)の表示
独自アイテムの開発
標準で提供される3Dアイテム以外にも、簡単なコーディングで独自の3Dアイテムも可視化できます。以下はサンプルです。
from OpenGL.GL import *
import numpy as np
import threading
import q3dviewer as q3d
from PySide6.QtWidgets import QLabel, QSpinBox
class YourItem(q3d.BaseItem):
def __init__(self):
super(YourItem, self).__init__()
pass # 必要な初期化
def add_setting(self, layout):
# このアイテムを設定するためのGUI
label = QLabel("Add your setting:")
layout.addWidget(label)
box = QSpinBox()
layout.addWidget(box)
def set_data(self, data):
pass # データをsetする
def initialize_gl(self):
pass # OpenGLの初期化設定(必要であれば)
def paint(self):
pass # OpenGLを使って3D物体を可視化する
興味のある方は、ぜひ「q3dviewer」をインストールして、試してください。
ソースはGithubに公開しています。




