ギズモ
ギズモは、エディターのワールド内ビジュアライゼーションおよび操作レイヤーです。シーンビュー上に線、ボックス、球、ラベルを描画し、ビルトインコンポーネントの動作(カメラの視錐台、ライトの形状、コライダーの境界)を表示するとともに、ビューポート内でオブジェクトを直接移動、回転、スケールするためのインタラクティブなトランスフォームギズモを提供します。
シーンビューのナビゲーション
ビューポートには、ゲームのカメラとは独立した自由視点カメラがあります。マウスの右ボタンを押したまま周囲を見回します。押している間:
- WASD で移動、Q/E で下降・上昇、Shift で加速。
- マウスホイールでいつでも前後にドリー。
- F で現在の選択対象にカメラをフレーミング。
ツールバーのカメラ ▾ メニューでナビゲーションの感度を調整します——移動速度、ルック感度、ズーム速度(ホイールドリーが強すぎる場合に便利)。設定はエディターの Settings ストアを介してセッション間で保持されます。
オブジェクトの選択
シーンビューでオブジェクトをクリックして選択します——メッシュは実際の境界に対するレイキャストでピックされ、ライト/カメラ/エンプティはアイコンをクリックしてピックします。空のスペースをクリックすると選択が解除されます。(従来通りシーンツリーから選択することもできます。)
トランスフォームギズモ
オブジェクトを選択すると、シーンビューの原点に色付きのハンドルが表示されます。このハンドルは画面上で一定のサイズでカメラに追従します。
| モード | ホットキー | ハンドル | ドラッグ効果 |
|---|---|---|---|
| 移動 | W |
3 つの軸矢印(X 赤、Y 緑、Z 青) | オブジェクトをその軸に沿ってスライド |
| 回転 | E |
3 つの軸円 | オブジェクトをその軸を中心に回転 |
| スケール | R |
立方体チップ付きの 3 つの軸線 | オブジェクトをその軸に沿ってスケール |
軸にホバーしてハイライト表示し、ドラッグして操作します。各ドラッグは 1 つのアンドゥステップ(Ctrl+Z)です。モードボタンはシーンビューツールバーにあります。
スナップ
ツールバーでスナップをトグルすると、ドラッグが固定増分に制約されます——移動は 0.5 単位、回転は 15°、スケールは 0.25。スナップは行う変化を丸めるため、値をきれいなグリッドに調整できます。
コンポーネントギズモ
ビルトインコンポーネントは独自のビジュアライザーを描画し、ツールバーのギズモ ▾ メニューでフィルタリングできます:
- カメラ——視錐台の輪郭とカメラアイコン。視錐台はそのカメラが選択されている場合のみ描画されます。
- ライト——ディレクショナルライトは太陽のディスクと平行光線を表示;ポイントライトは範囲内にワイヤー球を表示;スポットライトはワイヤーコーンを表示。選択されたライトのみ形状が描画されるため、ライトで満たされたシーンでも読みやすく保たれます。すべてのライトは常にその色に着色された電球アイコンを表示します。
- コライダー——コライダー境界の周囲のワイヤーボックス。
- アイコン——ライト/カメラ(およびカスタムタイプ)のビルボードアイコン。
- 選択アウトライン——選択されたオブジェクトのメッシュ周囲のオレンジ色のボックスで、メッシュの実際の境界に沿います。非マテリアルノード(ライト、カメラ、エンプティ)には空間的広がりがないため、アウトラインは表示されません——代わりにアイコンとトランスフォームハンドルが選択を示します。
- グリッド——XZ 平面上の地面グリッド、中心軸は明るく表示。
各タイプは独立してトグルできるため、必要なビジュアルを保ちながらビューポートを整理できます。
ギズモ API
ギズモはプレーンデータのコマンドバッファ(engine.Gizmos)に記録されます——GPU や GUI の依存関係は不要——そのため、独自のスクリプトを含む任意のコンポーネントが記録できます。各形状は色付きの線分に分解されます。
const engine = @import("engine");
fn draw(giz: *engine.Gizmos, center: engine.Vector3) void {
giz.setColor(.green);
giz.wireSphere(center, 0.5);
giz.setColor(.yellow);
giz.arrow(center, center.add(.{ .x = 0, .y = 2, .z = 0 }));
giz.setColor(engine.Gizmos.Color.rgb(0.2, 0.6, 1.0));
giz.box(center, .{ .x = 1, .y = 1, .z = 1 });
giz.label(center, "spawn point");
}
利用可能なプリミティブ:line、lineW、ribbon、ray、polyline、arrow、tube、box、wireCube(マトリックス指向)、circle、wireSphere、wireCone、frustum、label。setColor、setLineWidth、setMatrix はその後ろに記録されるすべてのものに適用されます。setMatrix を使用するとオブジェクトのローカル空間で描画できます。
線の太さ
線には画面空間のピクセル単位の太さがあり、頂点ごとに保持されます。レンダラーは各セグメントをカメラ面向きのクアッドに拡張するため、カメラがどの距離にあっても線は同じ幅を保ちます。setLineWidth で均一幅を設定するか、端点ごとに変化させます:
giz.setLineWidth(3); // 以降すべて 3px
giz.arrow(a, b); // 太くて読みやすい矢印
// 先細りになって消える彗星の軌跡——点ごとの幅。
const pts = [_]engine.Vector3{ head, mid, tail };
const widths = [_]f32{ 8, 4, 0 };
giz.ribbon(&pts, &widths);
lineW(a, b, wa, wb) は wa から wb に先細りする単一セグメントを描画し、ribbon(points, widths) はそれらを可変幅のストリップに連結します。トランスフォームギズモの移動/スケールハンドルは setLineWidth を使用して、1px の糸ではなく実体のあるバーとして認識(およびグラブ)されるようにしています。
カスタムコンポーネントギズモ、アイコン、レイヤー
拡張機能はエディターのギズモシステムにコンポーネントタイプ名で登録します——ドロワー(線/ラベルを記録)、ビルボードアイコン、および/または可視性レイヤー(Unity スタイル):
GizmoSystem.registerGizmo("WaypointPath", drawWaypoints);
GizmoSystem.registerIcon("WaypointPath", dvui.entypo.flag);
GizmoSystem.setLayer("WaypointPath", "Navigation");
fn drawWaypoints(giz: *engine.Gizmos, node: *const engine.SceneNode, comp: *const engine.Component) void {
_ = comp;
giz.setColor(.cyan);
giz.wireSphere(node.transform.position, 0.25);
}
カスタムギズモとアイコンは、ビルトインと同様にカスタム/アイコンの可視性トグルに従います。
注記
- ギズモはエディタービューポートでのみレンダリングされ、出荷されたゲームでは決して表示されません。
- ワールドギズモはシーンに対して深度テストされます。トランスフォームハンドルは常に最前面に描画されるため、グラブ可能な状態を保ちます。
- 回転ハンドルはワールド軸を中心に回転します。すでに回転しているオブジェクトの場合、結果は対応するオイラー角に適用されます。