はじめに
PointWeaverでは、点群ファイルを開き、ノードグラフで処理を組み、3Dビューで結果を確認します。 ユーザーが主に編集するのはExpressionノードの中身です。
点群を開く
File > Open Point Cloud... から LAS / LAZ / PLY / PCD を開きます。
式を書く
ノードエディタでExpressionノードを選び、左のエディタに複数行の代入式を書きます。
確認して書き出す
3Dプレビューやスプレッドシートで確認し、File > Export... で書き出します。
基本操作
| やりたいこと | 操作 |
|---|---|
| 点群ファイルを開く | File > Open Point Cloud... |
| デモ点群を開く | File > Demo |
| Expressionノードを追加する | Edit > Add Expression Node |
| 式の構文チェックをする | Edit > Validate Expressions |
| プレビューを更新する | Edit > Refresh Preview |
| 点群を書き出す | File > Set Output... で出力先を決め、File > Export... |
| 属性表を見る | View > Geometry Spreadsheet |
Expressionノード
Expressionノードは、入力点群を受け取り、各点の属性を書き換えて出力します。 ノードを複数つなぐと、Sourceに近いノードから順番に式が実行されます。
Expression Editor
X = round(X)
Y = round(Y)
Z = round(Z)
R = remap(Z, minZ, maxZ, 0, 255)
Preview
式を反映した点群を3Dで確認します。
Node Editor
構文の基本
1行に1つの代入式を書きます。左辺は書き換える属性、右辺は数値式です。 空行は無視されます。
属性 = 式
属性 = 式
属性 = 式
最小例
Z = round(Z)
各点の Z を丸め、その値を同じ点の Z に書き戻します。
複数行
X = round(X)
Y = round(Y)
Z = round(Z)
行は上から順番に実行されます。同じノード内で前の行が書き換えた値を、 後続行から参照できます。
コメントについて
現在のMVPではコメント構文はありません。説明を残したい場合は、 プロジェクト外のメモに残してください。
属性
属性名は式の中で読み書きできます。大文字表記の座標・色属性と、 小文字の属性名を使います。
| 属性 | 意味 | 読み取り | 代入 | 例 |
|---|---|---|---|---|
X | X座標 | 可 | 可 | X = round(X) |
Y | Y座標 | 可 | 可 | Y = Y + 10 |
Z | Z座標 | 可 | 可 | Z = Z * 0.5 |
R | 赤成分 | 可 | 可 | R = 255 |
G | 緑成分 | 可 | 可 | G = remap(intensity, 0, 65535, 0, 255) |
B | 青成分 | 可 | 可 | B = 64 |
intensity | 反射強度 | 可 | 可 | intensity = intensity * 1.2 |
classification | 分類コード | 可 | 可 | classification = if(Z > 10, 2, 1) |
x ではなく X です。
統計値
式の中では、処理中の点群範囲を表す統計値を参照できます。
高さで色を付ける処理では minZ と maxZ をよく使います。
| 名前 | 意味 | 例 |
|---|---|---|
minX | 現在段階のX最小値 | R = remap(X, minX, maxX, 0, 255) |
maxX | 現在段階のX最大値 | R = remap(X, minX, maxX, 0, 255) |
minY | 現在段階のY最小値 | G = remap(Y, minY, maxY, 0, 255) |
maxY | 現在段階のY最大値 | G = remap(Y, minY, maxY, 0, 255) |
minZ | 現在段階のZ最小値 | B = remap(Z, minZ, maxZ, 255, 0) |
maxZ | 現在段階のZ最大値 | R = remap(Z, minZ, maxZ, 0, 255) |
複数ノードをつないだ場合、後段ノードの統計値は前段ノードの処理結果を反映します。
例えば先に Z = round(Z) を実行した場合、次ノードの minZ /
maxZ は丸めた後のZ範囲になります。
演算子
| 種類 | 演算子 | 例 |
|---|---|---|
| 加算 | + | Z = Z + 1 |
| 減算 | - | X = X - minX |
| 乗算 | * | Z = Z * 0.3048 |
| 除算 | / | Z = Z / 1000 |
| 剰余 | % | R = X % 255 |
| 比較 | < <= > >= == != | classification = if(Z > 5, 2, 1) |
比較式の値
比較式は条件として使います。主な用途は if(condition, a, b) の第1引数です。
R = if(Z > 10, 255, 0)
関数
関数は name(arg1, arg2, ...) の形で呼び出します。
引数には属性、統計値、数値、別の関数呼び出しを書けます。
| 関数 | 説明 | 例 |
|---|---|---|
round(x) | 最も近い整数に丸めます。 | Z = round(Z) |
floor(x) | 小さい側の整数へ丸めます。 | Z = floor(Z) |
ceil(x) | 大きい側の整数へ丸めます。 | Z = ceil(Z) |
clamp(x, min, max) | 値を範囲内に制限します。 | R = clamp(R, 0, 255) |
remap(x, inMin, inMax, outMin, outMax) | 入力範囲を出力範囲へ線形変換します。 | R = remap(Z, minZ, maxZ, 0, 255) |
min(a, b) | 小さい方を返します。 | Z = min(Z, 100) |
max(a, b) | 大きい方を返します。 | Z = max(Z, 0) |
abs(x) | 絶対値を返します。 | R = abs(X) |
sqrt(x) | 平方根を返します。 | R = sqrt(intensity) |
sin(x) | サインを返します。単位はラジアンです。 | Z = Z + sin(X) |
cos(x) | コサインを返します。単位はラジアンです。 | Z = Z + cos(Y) |
if(condition, a, b) | 条件が真なら a、偽なら b を返します。 | R = if(Z > 10, 255, 0) |
remapの考え方
R = remap(Z, minZ, maxZ, 0, 255)
Z == minZ の点は R = 0、
Z == maxZ の点は R = 255 になります。
入力値が範囲外なら、その分だけ外挿されます。
remap は自動でclampしません。
0から255に収めたい場合は clamp(remap(...), 0, 255) と明示します。
型と範囲
式は数値式として評価されます。代入先の属性に応じて保存時・表示時の扱いが変わります。
| 代入先 | 扱い | 注意 |
|---|---|---|
X Y Z |
座標値として扱います。 | 小数を保持できます。グリッドに吸着したい場合は round などを使います。 |
R G B |
表示色として扱います。 | プレビューでは0から255の色成分として表示されます。 |
intensity |
反射強度として扱います。 | ファイル形式により保存可能な範囲が異なります。 |
classification |
分類コードとして扱います。 | 整数コードを入れる用途を想定しています。 |
式の例
座標を1mグリッドへスナップ
X = round(X)
Y = round(Y)
Z = round(Z)
Z高さを赤色に割り当て
R = remap(Z, minZ, maxZ, 0, 255)
高さで赤から青へグラデーション
R = remap(Z, minZ, maxZ, 0, 255)
G = 0
B = remap(Z, minZ, maxZ, 255, 0)
指定高さより上だけ分類を変更
classification = if(Z > 10, 2, classification)
反射強度をグレースケール表示
R = remap(intensity, 0, 65535, 0, 255)
G = remap(intensity, 0, 65535, 0, 255)
B = remap(intensity, 0, 65535, 0, 255)
Z方向を誇張
Z = Z * 2
波形を加える
Z = Z + sin(X * 0.1) * 2
プレビュー
Final Output
ノードグラフ上のExpressionノードを最後まで実行した状態を表示します。 通常はこちらで最終結果を確認します。
Selected Stage
ノードエディタ右上のボタンで切り替えます。 選択中のExpressionノードまで処理した途中結果を表示します。
3Dプレビュー右下の Preview Controls を開くと、 プレビューサンプル数、描画上限、点サイズ、ビュー方向、ギズモ表示を調整できます。
Geometry Spreadsheet
View > Geometry Spreadsheet から別ウィンドウで開きます。
点ごとの ptnum、座標、色、反射強度、分類を表で確認できます。
| 機能 | 説明 |
|---|---|
| Preview / Source | 処理後プレビューと元サンプルを切り替えます。 |
| Start / Rows | 表示開始行と表示行数を調整します。 |
| ptnum Go | 指定した点番号へ移動します。現在のサンプルに含まれる点だけ対象です。 |
| Frame Selected | 選択した点へ3Dビューを寄せます。 |
エラー表示
式に問題がある場合、エディタ下部に行番号・列番号つきで表示されます。 ノードキャンバス上では、問題のあるノードに警告表示が付きます。
| よくある原因 | 修正例 |
|---|---|
| 存在しない属性名を使った | x ではなく X を使います。 |
| 関数名を間違えた | rempa ではなく remap を使います。 |
| 関数の引数が足りない | remap(Z, minZ, maxZ, 0, 255) のように必要な引数をすべて書きます。 |
| 代入先が属性ではない | minZ = 0 のような統計値への代入はできません。 |