blob: e50f8ee75f645ed8f537a2b3ff16a93baa8845c1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
---
title: 'XRReferenceSpace: reset イベント'
slug: Web/API/XRReferenceSpace/reset_event
tags:
- API
- AR
- Event
- Graphics
- Reality
- Reference
- VR
- Virtual
- WebXR
- WebXR API
- WebXR Device API
- XR
- XRReferenceSpace
- augmented
- reset
translation_of: Web/API/XRReferenceSpace/reset_event
---
<p>{{APIRef("WebXR Device API")}}{{secureContext_header}}</p>
<p><span class="seoSummary">ネイティブの原点または実際の原点のいずれかで不連続が検出されると、<strong><code>reset</code></strong> イベントが {{domxref("XRReferenceSpace")}} オブジェクトに送信され、参照空間を使用して方向付けられたオブジェクトの位置または方向がジャンプします。</span> これは、ユーザーが XR デバイスを較正または再較正する場合、またはデバイスがユーザーの追跡を失った後に原点を自動的に変更してから再び取得する場合によく見られます。</p>
<p>{{domxref("XRBoundedReferenceSpace")}} オブジェクトの場合、{{domxref("XRBoundedReferenceSpace.boundsGeometry", "boundsGeometry")}} が変更されたときに <code>reset</code> イベントを発生させることもできます。</p>
<p>いずれの場合も、イベントは、新しい原点を利用する WebXR アニメーションフレームが実行される前に送信されます。</p>
<table class="properties">
<tbody>
<tr>
<th scope="row">バブリング</th>
<td>あり</td>
</tr>
<tr>
<th scope="row">キャンセル</th>
<td>不可</td>
</tr>
<tr>
<th scope="row">インターフェイス</th>
<td>{{domxref("XRReferenceSpaceEvent")}}</td>
</tr>
<tr>
<th scope="row">イベントハンドラープロパティ</th>
<td>{{domxref("XRReferenceSpace/onreset", "onreset")}}</td>
</tr>
</tbody>
</table>
<h2 id="Usage_notes" name="Usage_notes">使用上の注意</h2>
<p><code>reset</code> イベントは、参照空間の原点を変更し、イベントの {{domxref("XRReferenceSpaceEvent.transform", "transform")}} プロパティで示されるように移動および回転することにより、座標系がリセットまたは再構成されたことを示します。 イベントは、アニメーションフレームのコールバックが実行されて保留中のフレームがレンダリングされる前に送信され、これらのコールバックで更新された座標系が使用可能であることを確認します。</p>
<p>リセットが発生する理由はいくつかあります。 それらの間で最も一般的なものは次のとおりです。</p>
<ul>
<li>ユーザーが、顔の向きおよびハンドコントローラーがユーザーの実際の位置および顔の向きと同期するようにヘッドセット自体の再較正を要求するなどして、手動で座標系をリセットしました。 これは主に、<code>local</code> または <code>local-floor</code> の参照空間の問題です。</li>
<li><code>bounded-floor</code> 参照空間では、ユーザーが参照空間の境界を出て新しい参照空間に入る場合、座標系をリセットできます(ゲーム内のあるレベルから別のレベルに横断する場合など、各レベルは独自の座標系を持つ独自のマップです)。</li>
<li>追跡システムは一時的にユーザーを見失い、その後再びユーザーを取り戻しましたが、最後に知られた位置のすぐ近くを離れるのに十分な距離を移動した後になってからでした。 主に <code>unbounded</code> 参照空間の問題です。</li>
<li>ユーザーは、<code>unbounded</code> 参照空間にいて、開始位置(参照空間の原点)から十分に離れているため、浮動小数点またはその他の形式の誤差またはドリフトが問題になります。 このため座標系は、ユーザーの現在の位置またはその近くの新しい原点でリセットされます。</li>
<li>WebXR インフラストラクチャーまたはハードウェアドライバーは、デバイスが一時的に追跡を失い、ハードウェアとソフトウェアの位置と方向が同期していないことを検出しました。</li>
</ul>
<div class="blockIndicator note">
<p><strong>注</strong>: 参照空間が以前の原点の追跡を取り戻すことができる場合、<code>reset</code> イベントは発生<em>しません</em>。 これは、原点が強制的に再配置されていないことを意味します。 このイベントは、追跡喪失から回復するために原点を再配置する必要がある場合にのみ発生します。</p>
</div>
<h3 id="Manual_resets" name="Manual_resets">手動リセット</h3>
<p>VR ヘッドセットを使用したことがある人なら、起動したときに正面を向いているのに、ヘッドセットは空や床を見ていると勘違いしたり、ハンドコントローラーをまっすぐ前に向けているのに、どこか上や右に向けていると勘違いしたりしたことがあるでしょう。このような場合、通常はどこかのボタンを押し続けると、世界がデバイスの現在の向きに再同期されます。 これは、ヘッドセットの向きに基づいた1つまたは複数の参照空間に `reset` イベントを送信することで機能します。</p>
<h3 id="Handling_discontinuities" name="Handling_discontinuities">不連続性の処理</h3>
<p>ビューアーの位置のジャンプは、{{domxref("XRPose")}} の Boolean プロパティ {{domxref("XRPose.emulatedPosition", "emulatedPosition")}} を監視することで処理できます。 ビューアーの位置のジャンプが、<code>emulatedPosition</code> が <code>true</code> から <code>false</code> に切り替わるのと同時に起こった場合、ビューアーは追跡を回復し、新しい位置は以前にエミュレートされた値からの補正を表します。 これは、サイトまたはアプリが、(XR デバイスが移動を導入するために使用するユーザーの物理的な移動ではなく)ビューアーの位置や向きを明示的に変更することによる空間内のモーションをシミュレートしない場合に一般的に望ましい振る舞いです。</p>
<p>ただし、そのような「テレポート」が使用されている場合は、追跡を回復した後に、追加の潜在的に不快なジャンプが発生する可能性があり、実際にはユーザーの位置をジャンプしないようにする必要があります。 これを許可する代わりに、{{domxref("XRReferenceSpace.getOffsetReferenceSpace", "getOffsetReferenceSpace()")}} を呼び出す前に計算されたテレポーテーションオフセットに <code>emulatedPosition</code> を統合して、更新された実際の原点が前のフレームからビューアーの位置がジャンプした隔たりによって調整された新しい参照空間を作成できます。 このようにして、ユーザーの位置を2回ではなく1回だけ変更します。</p>
<h3 id="The_effect_of_discontinuity_size" name="The_effect_of_discontinuity_size">不連続の大きさの効果</h3>
<p>不連続が十分に小さく、デバイスが同じ追跡領域内で追跡を取り戻せる場合、<code>reset</code> イベントは発生しません。 また、ユーザーの近くで空間の安定性を維持するために、時間の経過とともにネイティブの原点に小さな調整を加えるため、unbounded 参照空間で発生することもありません。 大きな不連続のみがリセットをトリガーします。</p>
<h2 id="Examples" name="Examples">例</h2>
<p><code>reset</code> イベントのハンドラーを追加するには、2つの方法のいずれかを使用できます。 まず、次のように {{domxref("EventTarget.addEventListener", "addEventListener()")}} メソッドを使用できます。</p>
<pre class="brush: js notranslate">viewerRefSpace.addEventListener("reset", (event) => {
/* perform reset related tasks */
});
</pre>
<p>2番目のオプションは、次のように <code>XRReferenceSpace</code> オブジェクトの {{domxref("XRReferenceSpace.onreset", "onreset")}} イベントハンドラープロパティを設定することです。</p>
<pre class="brush: js notranslate">viewerRefSpace.onreset = (event) => {
/* perform reset related tasks */
};
</pre>
<h2 id="Specifications" name="Specifications">仕様</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">仕様</th>
<th scope="col">状態</th>
<th scope="col">コメント</th>
</tr>
<tr>
<td>{{SpecName('WebXR','#eventdef-xrreferencespace-reset','reset event')}}</td>
<td>{{Spec2('WebXR')}}</td>
<td>初期定義</td>
</tr>
</tbody>
</table>
<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>
<div class="hidden">
<p>The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p>
</div>
<p>{{Compat("api.XRReferenceSpace.onreset")}}</p>
|