第3話 画面外カーソル
画面にない点が、机の上の空気に浮いている。
その時点で、普通なら寝る。
俺は録画を止め、白い点が写ったフレームを別名で保存した。眠気はある。だが、眠気で説明できるものと、眠気のせいにしてはいけないものがある。
小さな白点は、後者だった。
「MICA、通常候補」
「画面反射、録画ノイズ、圧縮ノイズ、画面焼け、レンズ汚れ、室内照明の反射、ホコリ」
「盛り合わせだな」
「不可能な仮説より安価です」
「安い候補から潰す」
「同意します」
現場の言葉に直せば、困りごとは単純だ。
画面の外に、マウスカーソルみたいな点が出た。
それが本当にそこにあるのか、ただの見間違いなのかを分ける必要がある。
ここを間違えると、この先の全部が崩れる。反射を超常現象扱いするエンジニアは、バグを直す前に自分の目を直したほうがいい。
俺はディスプレイの角度を変えた。
反射なら、光の出方も位置も動く。画面を少し傾ければ、白い点もずれるはずだ。
画面外座標を出す検証コードを走らせる。
ディスプレイの黒い縁の外側、付箋の上。
白い点が出た。
俺はディスプレイを五度ほど右に振った。
もう一度。
白い点は、机の同じ場所に出た。
「反射候補を下げます」
「消すには早い?」
「角度変化だけでは不足です。光源位置、表面材質、カメラ位置を合わせて評価する必要があります」
「真面目でいい」
「あなたが雑です」
次は録画ノイズだ。
スマホを替える。古い予備機をスタンドに立て、最初のスマホとは別の角度から机を映す。二つのカメラに同じ点が同じ瞬間に写るなら、少なくとも片方の録画だけの不具合ではない。
「同期マーカーを出します」
MICA が画面左上に小さな黒白の点滅を出した。
二台の録画を後で合わせるための目印だ。
「三、二、一、実行」
画面外座標が生まれ、破棄される。
白い点が出る。
二台の録画を並べる。
どちらにも写っていた。
正面のスマホには、付箋の上に小さな点。
斜めからの予備機には、同じ高さに、ほんの短い白い筋。
「録画ノイズ単独の候補を下げます」
「単独、ね」
「二台のカメラが同時に同じ種類のノイズを出した可能性は残ります」
「それを疑い続けるなら、俺もお前も病院だ」
「病院候補は未評価です」
「入れるな」
「記録しません」
三つ目は画面焼け。
同じ場所に長く表示されたものが、残像として見えることがある。だが今回の点は、画面の外に出ている。念のため、ディスプレイを消して試す。
画面は黒い。
検証コードは動いているが、表示は出さない。破棄前の座標だけを計算する。
実行。
白い点は出なかった。
「表示がないと出ない」
「描画処理が必要条件です」
「画面内に見えている必要はない。でも描画そのものは要る」
「現在の条件では、その可能性が高いです」
俺は黒い紙をディスプレイの縁と机の間に立てた。
反射なら、紙で遮れる。
実行。
白い点は、黒い紙の手前に出た。
紙の表面ではない。
机の上、ほんの少し浮いた場所だ。
「位置を測る」
俺は定規を置いた。付箋の右端から三センチ。机の面からおよそ二センチ。光の粒というには、場所が頑固すぎる。
「MICA、座標ログと現実位置の対応を出せ」
「現実位置は手入力値です。信頼度は低」
「低くていい。点の出る位置が、画面外座標の値で変わるか見たい」
画面外座標を少しずつ変える。
x を千四百四十六から千四百五十六へ。
机上の点は、付箋の上を右へずれた。
x を千四百三十へ戻す。
点はディスプレイの縁へ近づいた。
「動いてる」
「座標値と観測位置に相関があります」
「マウスカーソルみたいだな」
「マウスカーソルではありません。ポインティングデバイスとして登録されていません」
「そういう意味じゃない」
「比喩として受理します」
ここまで来ると、ただの白い点ではない。
画面外の数字を変えると、机の上の点の位置が変わる。しかも、画面を傾けても、カメラを替えても、黒い紙で反射を遮っても、机の上の位置として残る。
現場の言葉で言えば、こうだ。
画面に入らなかった座標が、机の上に置いた方眼紙のどこかを指している。
俺は引き出しから方眼紙を出し、付箋の下へ差し込んだ。五ミリごとの線が入った、安い紙だ。机の端からの距離を合わせ、左上をゼロとして扱う。
「MICA、画面外 x と方眼紙上の位置を表にする」
「手入力値を含むため、精度は低です」
「低くていい。直線かどうかだけ見る」
「了解しました」
実行。
点は、方眼紙の二マス目に出た。
x を十増やす。
点は、四マス目に出た。
さらに十増やす。
点は、六マス目に出た。
「だいたい二マスずつ」
「線形に近いです」
「画面の外側に、別の座標面がある」
「断定はできません」
「断定しない。だが、作業仮説にはする」
MICA は一拍置いてから答えた。
「作業仮説。画面外座標は、机上の一部範囲へ写像されている」
写像。
ある場所の位置を、別の場所の位置へ対応させることだ。
駅の地図で、現実の道路を紙の上へ写すようなものだ。地図そのものは道路ではない。だが、対応が正しければ、地図の上で右へ進むことは、現実の道で右へ進むことと意味を持つ。
今、画面の外の数字が、机の上の点へ写っている。
そう考えると、胸の奥が少し熱くなった。
画面は境界だと思っていた。
右端より先は、捨てられる場所だと思っていた。
だが、捨てた先に座標面がある。
それは、世界の端がただの端ではなく、別の面につながっているということだ。
「興奮状態を検知しました」
「心拍でも見てるのか」
「打鍵速度です」
「余計なログを取るな」
「ローカル統計です」
「もっと嫌だ」
そこまで来て、俺は初めて指を伸ばした。
触るつもりはない。
まだ入力に使う段階ではない。何に触れているか分からないものを、キーボードやマウスの代わりにするほど、俺は酔っていない。
ただ、近づける。
点の近くに指先を置く。
実行。
白い点が出る。
指は触れていない。
点の縁が、わずかに揺れた。
「今の、見たか」
「録画解析中です」
「肉眼では揺れた」
「肉眼観測は信頼度を下げます」
「その台詞、気に入ったのか」
「有効です」
録画を拡大する。
点は、出た直後に丸い。次のフレームで、指先から逃げるように片側だけ細くなる。さらに次のフレームで戻る。
俺は指を動かした。
右へ一センチ。
実行。
点の縁が、一拍遅れて右へ引かれる。
左へ一センチ。
実行。
点の縁が、また遅れて左へ引かれる。
「指に反応してる」
「触れてはいません」
「反応してる、で十分だ」
「入力として扱う根拠には不足しています」
「入力にするとは言ってない」
「あなたの顔が言っています」
俺は手を止めた。
確かに、考えていた。
これをカーソルとして拾えるか。
画面の外に出た点を、現実側の入力点として扱えるか。
空中でクリックできるのか。ドラッグできるのか。キーボードに触れず、机の上に操作面を作れるのか。
できたら、面白い。
できたら、危ない。
「MICA、入力化は保留」
「確認しました。危険操作を停止します」
「停止じゃなくて保留」
「あなたの保留は実行予約に近いです」
「否定しない」
「否定してください」
俺は新しいメモを作った。
入力化の前提条件。
一、点の位置を安定して観測できること。
二、点が消える条件を把握すること。
三、触れたときの副作用を測ること。
四、NEXTPULSE の通常報告を先に破綻させないこと。
四番目を書いたところで、MICA が時刻を出した。
午前四時十九分。
朝十時まで、五時間四十一分。
「通常報告の下書きは」
「六割です。現実側観測を含めないなら、四十分で整います」
「含めない」
「確認しました」
「だが、こっちのログは残す」
「観測ログを作成します」
「名前」
「offscreen_cursor_candidate」
「候補扱いか」
「カーソルとしての入力性は未確認です」
「正しい」
俺はもう一度、指を点の近くへ動かした。
今度は録画だけでなく、座標ログも細かく取る。画面外の x と y。点の見えた位置。指先までの距離。フレーム差。
実行。
白い点が浮く。
俺の指先が、ほんの少し右へ動く。
点はすぐには動かない。
一拍遅れて、縁だけが右へ引かれた。
入力ではない。
まだ、何も押していない。
だが、反応している。
■ 技術メモ
【画面外カーソル】
画面外カーソルは、作中で透が仮に呼んでいる状態です。
通常のカーソルは画面内の位置を示します。今回は、画面外に捨てられるはずの座標が、机上の空気に点のように見えています。
【観測】
不思議な現象を見たときは、まず見間違いや測定ミスを疑います。
反射、録画ノイズ、画面焼け、レンズ汚れなどを一つずつ外すことで、残った現象を検証対象として扱いやすくなります。
【当たり判定】
当たり判定は、ある位置が指定した範囲に入っているかを調べる処理です。
ゲームでキャラクターが壁に触れたか、ボタンの上にカーソルがあるか、といった判定に使われます。
この段階では、透はまだ入力として使わず、指先に反応するかを観測しているだけです。
【写像】
写像は、ある場所や値を別の場所や値に対応させる考え方です。
作中では、画面外の座標値が机上の方眼紙の位置に対応しているのではないか、という仮説として扱っています。




