選択する
ツールレール ▚ 選択(ショートカット V)。形状を 矩形 か 投げ縄 から選び、 画面上をドラッグして範囲を囲みます。Esc でドラッグを中断、 もう一度 Esc(または「選択クリア」)で選択を解除します。
選択は「述語」であって「点の一覧」ではない
これが oniyanma の選択のいちばん重要な性質です。
選んだ結果として保持しているのは、点の ID の集合ではありません。 「この形(箱 / 多角柱)の中にある点」という条件そのものを持ちます。帰結として:
- カメラを動かしても選択は変わりません。 投げ縄は画面上で描きますが、確定した瞬間に ワールド空間の凹多角柱に変換されます。視点を変えても、同じ点が選ばれ続けます
- LOD が点を捨てて再ロードしても選択は残ります。 述語を再評価するだけだからです
- 他人に選択を渡すと、相手の画面でも厳密に同じ点が選ばれます。共同編集で「ここ見て」が座標の口頭説明にならないのはこのためです
- 同じ選択が同じ結果を返すことをテストで固定できます。 凹多角形の point-in-polygon、カメラ後方(w ≤ 0)の棄却、視点移動に対する不変性は回帰テスト済みです
選択点数の読み方
パネルには「選択(常駐) n 点」と出ます。この n は resident 基準、 つまりいま表示されている LOD サンプルの中で条件を満たす点の数です。 原本の全点を走査した数ではありません。
寄れば LOD が細かくなり、同じ範囲でも n は増えます。 「この範囲に何点あるか」を厳密な値として扱わないでください。 編集のドライランが返す件数も同じ基準です。
コマンドから選択する
| コマンド | 内容 |
|---|---|
selectBox | 整列フレームの AABB で選択。min / max は getState().alignedBounds の範囲内 |
selectAll | 読み込み済み全体を選択(⌘A) |
clearSelection | 解除(Esc) |
zoomToSelection | 選択が収まるまでカメラを寄せる(⇧2) |
querySelection | 現在の選択の点数と AABB |
queryBoxCount | 選択せずに、指定した箱の中の点数だけ数える |
selectBox が受け取るのは整列(シーン)フレームの座標で、実座標ではありません。 まず全体の範囲を取り、その中で箱を組み立てます。
js
const { alignedBounds: b } = oniyanma.getState()
// 上端 20% のスラブを選ぶ
const zTop = b[5] - (b[5] - b[2]) * 0.2
await oniyanma.execute('selectBox', { min: [b[0], b[1], zTop], max: [b[3], b[4], b[5]] })座標系の使い分けは リファレンス概要 にまとめてあります。