generated from w3c/note-respec-repo-template
-
Notifications
You must be signed in to change notification settings - Fork 12
/
index.html
668 lines (667 loc) · 19.6 KB
/
index.html
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
The <model> element
</title>
<script defer class="remove" src=
"https://www.w3.org/Tools/respec/respec-w3c"></script>
<script class="remove">
// See: https://respec.org/docs/ for all configuration options
var respecConfig = {
shortName: "model-element",
specStatus: "CG-DRAFT",
editors: [
{
name: "Marcos Cáceres",
company: "Apple Inc.",
retiredDate: "2024-04-01",
companyURL: "https://apple.com/",
},
{
name: "Brandel Zachernuk",
company: "Apple Inc.",
companyURL: "https://apple.com/",
},
{
name: "Laszlo Gombos",
company: "Samsung",
companyURL: "https://samsung.com/",
},
],
group: "cg/immersive-web",
github: {
repoURL: "immersive-web/model-element",
branch: "main",
},
xref: "web-platform",
localBiblio: {
AOUSD: {
title: "OpenUSD",
href: "https://aousd.org",
publisher: "Alliance of OpenUSD",
},
},
};
</script>
</head>
<body>
<h1 id="title">
The <code><model></code> element
</h1>
<section id="abstract">
<p>
The `<model>` element allows embedding 3D graphical content inline within
an [[HTML]] document to be managed declaratively, and rendered directly
by the user agent. The `HTMLModelElement` interface then provides a
simple API for controlling the presentation, animation, interaction,
fetching, and UI affordances of a `<model>`.
</p>
</section>
<section id="sotd">
<p>
This is a work in progress.
</p>
</section>
<section>
<h2>
Introduction
</h2>
<p>
The HTML <model> element allows a website to embed interactive 3D
models as conveniently as any other visual media. Models are served as
a standalone resource. The <model> element also has support for
interaction and animation playback while presented within the page,
and supports more spatial experiences, such as the stereoscopic
display of 3D content where available.
</p>
<p>
As <model> is rendered directly by the user agent, it has
the ability to utilize privileged information, such as the user's
head and eye position or the lighting of the user's environment,
without exposing that information to JavaScript. Additionally, the use
of accessibility information and controls can be engaged in a
privacy-preserving manner.
</p>
<p>
As <model> is [=embedded content=], the user agent can present
3D content in a privacy-preserving, interactive, and accessible manner.
</p>
</section>
<section>
<h2>
Out of scope
</h2>
<p>
There are a number of specified non-goals for this initial incubation;
some are beyond the long-term scope of this proposal, and others are
deferred for the benefit of reaching consensus on an initial
specification, which can hopefully serve the needs of users and authors
sooner.
</p>
<h3>
Scene graph inspection and manipulation
</h3>
<p>
While the use cases for inspecting and manipulating the contents of a
given model asset are clear, the initial scope of this proposal is
intentionally limited to a reduced complexity, hopefully making the
initial specification one that has broad consensus amongst the web
community.
</p>
<h3>
Animation mixing and blending
</h3>
<p>
While many popular model formats include the ability to encode, play
and mix multiple animations in an animation mixing system, This initial
specification considers only a single animation timeline, both for
simplicity and for having a minimal viable specification on which the
web community can build on.
</p>
<h3>
Stateful interaction with `model` contents
</h3>
<p>
While many popular model formats support tapping on a 3D button inside
their contents to show or hide additional contents like a title, play
an animation or undertake some other stateful action. Because there is
no current intention to provide a JavaScript-facing mechanism to be
aware of such actions, stateful interactions should be considered out
of scope.
</p>
<h3>
Subresource loading
</h3>
<p>
While many popular model formats support the use of external asset
requests for better re-use and consistency, this initial specification
will only allow assets that are self-contained.
</p>
</section>
<section>
<h2>
Examples
</h2>
<h3>
Adding a model to a document
</h3>
<aside class="example">
<p>
The following example shows the simplest way to add a 3D model to a
document:
</p>
<pre class="html">
<model src="3d-assets/car"></model>
</pre>
<p>
By using content negotiation the user agent relies on the server to
send back a 3D model in a format the user agent supports.
</p>
</aside>
<h3>
Enabling interactivity
</h3>
<aside class="issue" data-number="20"></aside>
<h3>
Supporting multiple formats
</h3>
<aside class="example">
<p>
The following example shows a list of potential source formats
that can be selected from:
</p>
<pre class="html">
<model>
<source src="3d-assets/teapot.usdz" type="model/vnd.pixar.usd">
<source src="3d-assets/teapot.glb" type="model/gltf-binary">
</model>
</pre>
`<model>` source selection follows `<video>` selection,
where the top-level `src` attribute takes precedence if present,
followed by the first compatible `<source>` element encountered.
</aside>
<h3>
Providing fallback content for legacy user agents
</h3>
<aside class="issue" data-number="22"></aside>
<h3>
Making `model` accessible
</h3>
<aside class="issue" data-number="23"></aside>
</section>
<section>
<h2>
The <code><dfn class="element">model</dfn></code> element
</h2>
<dl>
<dt>
Categories
</dt>
<dd>
[=Flow content=].
</dd>
<dd>
[=Phrasing content=].
</dd>
<dd>
[=Embedded content=].
</dd>
<dd>
If the element has an `interactive` attribute: [=interactive
content=].
</dd>
<dd>
[=Palpable content=].
</dd>
<dt>
Contexts in which this element can be used:
</dt>
<dd>
Where [=embedded content=] is expected.
</dd>
<dt>
Content model:
</dt>
<dd>
If the element has a `src` attribute: transparent, a [^picture^] or
[^img^], or a <span class="link-me">media element</span> descendant.
</dd>
<dd>
If the element has no `src` attribute: Zero or more source elements,
then transparent, optionally intermixed with script-supporting
elements.
</dd>
<dt>
Tag omission in text/html:
</dt>
<dd>
Neither tag is omissible.
</dd>
<dt>
Content Attributes:
</dt>
<dd>
<span class="link-me">Global attributes</span>
</dd>
<dd>
[^model/autoplay^] — Hint that the resource can be started
automatically when the page is loaded
</dd>
<dd>
[^model/interactive^] — Allows the user to interact with the model
</dd>
<dd>
[^model/crossorigin^] — How the element handles crossorigin requests
</dd>
<dd>
[^model/height^] — Vertical dimension
</dd>
<dd>
[^model/loading^] — Used when determining loading deferral
</dd>
<dd>
[^model/loop^] — Whether to loop the media resource
</dd>
<dd>
[^model/muted^] — Whether to mute the media resource by default
</dd>
<dd>
[^model/poster^] — Poster frame to show while the resource is loading
</dd>
<dd>
[^model/src^] — Address of the resource
</dd>
<dd>
[^model/width^] — Horizontal dimension
</dd>
<dt>
DOM Interface
</dt>
<dd>
The {{HTMLModelElement}} interface provides a means to interface with
the embedded resource.
</dd>
</dl>
<p>
The [^model^] element is used for embedding 3D models into a document.
</p>
<p>
Content may be provided inside the [^model^] element. User agents
should not show this content to the user; it is intended for web
browsers which do not support [^model^], to be shown as <span class=
"link-me">fallback content</span>.
</p>
<aside class="issue" data-number="14"></aside>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">autoplay</dfn></code> attribute
</h3>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">interactive</dfn></code> attribute
</h3>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">controls</dfn></code> attribute
</h3>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">crossorigin</dfn></code> attribute
</h3>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">height</dfn></code> attribute
</h3>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">loading</dfn></code> attribute
</h3>
<aside class="issue" data-number="44"></aside>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">loop</dfn></code> attribute
</h3>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">muted</dfn></code> attribute
</h3>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">poster</dfn></code> attribute
</h3>
<p>
The [^model/poster^] attribute gives the URL of an image file that the
user agent can show while 3D content is unavailable. The attribute, if
present, must contain a <span class="link-me">valid non-empty URL
potentially surrounded by spaces</span>.
</p>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">src</dfn></code> attribute
</h3>
<h3>
<code><dfn class="element-attr" data-dfn-for="model">width</dfn></code> attribute
</h3>
</section>
<section data-dfn-for="HTMLModelElement">
<h2>
The `HTMLModelElement` interface
</h2>
<pre class="idl">
[Exposed=Window]
interface HTMLModelElement : HTMLElement {
};
</pre>
<aside class="issue" data-number="12"></aside>
<aside class="issue" data-number="42"></aside>
</section>
<section>
<h2>
`source` element integration
</h2>
<h3>
The `source` element's parent is a [^model^] element
</h3>
<aside class="issue" data-number="24"></aside>
</section>
<section>
<h2>
Interaction
</h2>
<aside class="issue" data-number="2"></aside>
<aside class="issue" data-number="46"></aside>
</section>
<aside class="issue" data-number="25"></aside>
<section>
<h2>
Controls
</h2>
<aside class="issue" data-number="43"></aside>
</section>
<section>
<h2>
Rendering
</h2>
<aside class="issue" data-number="1"></aside>
<aside class="issue" data-number="5"></aside>
<aside class="issue" data-number="48"></aside>
<aside class="issue" data-number="47"></aside>
<h3>
Orientation/camera
</h3>
<aside class="issue" data-number="42"></aside>
<aside class="issue" data-number="41"></aside>
<h3>
Embedded content
</h3>
<aside class="issue" data-number="27"></aside>
<p>
Whether a [^model^] element is <span class="link-me">exposing a user
interface</span> is not expected to affect the size of the rendering;
controls are expected to be overlaid above the page content without
causing any layout changes, and may disappear when the user does not
need them.
</p>
<p>
When a [^model^] element represents a poster frame, the poster frame is
expected to be rendered at the largest size that maintains the aspect
ratio of that poster frame without being taller or wider than the
[^model^] element itself, and is expected to be centered in the
[^model^] element.
</p>
</section>
<section>
<h2>
Events
</h2>
<aside class="issue" data-number="26"></aside>
</section>
<section>
<h2>
Formats
</h2>
<aside class="issue" data-number="18"></aside>
</section>
<section>
<h2>
Overlap with "media elements"
</h2>
<aside class="issue" data-number="13"></aside>
</section>
<section>
<h2>
HTML Integrations
</h2>
<p>
Additional integrations into HTML:
</p>
<aside class="issue" data-number="28"></aside>
<aside class="issue" data-number="29"></aside>
<h3>
Preload link relationship
</h3>
<aside class="issue" data-number="30"></aside>
<h3>
Integrations with `source` element
</h3>
<aside class="issue">
<p>
Some attributes on `source` are currently restricted to [^picture^].
We need to figure out which apply to [^model^].
</p>
</aside>
<h3>
Link rel="ar"
</h3>
<aside class="issue" data-number="45"></aside>
</section>
<section>
<h2>
CSS integrations
</h2>
<h3>
Media Playback States (`:playing`, `:paused`, `:seeking`)
</h3>
<aside class="issue" data-number="31"></aside>
<h3>
The `:muted` and `:volume-locked` pseudo-classes
</h3>
<h3>
Fullscreen Presentation State: the `:fullscreen` pseudo-class
</h3>
</section>
<section>
<h2>
Fullscreen integration
</h2>
<aside class="issue" data-number="31"></aside>
</section>
<section>
<h2>
Fetch integration
</h2>
<h3>
`"model"` destination
</h3>
<aside class="issue" data-number="35"></aside>
</section>
<section>
<h2>
Privacy considerations
</h2>
<aside class="issue" data-number="36"></aside>
</section>
<section>
<h2>
Security considerations
</h2>
<h3>
CORS
</h3>
<h3>
Formats and CORS
</h3>
<aside class="issue" data-number="15"></aside>
<h3>
Content Security Policy
</h3>
<aside class="issue" data-number="16"></aside>
<h3>
Format concerns
</h3>
<aside class="issue" data-number="17"></aside>
</section>
<section>
<h2>
Accessibility
</h2>
<aside class="issue" data-number="50"></aside>
<aside class="issue" data-number="39"></aside>
<h3>
Requirements for providing text to act as an alternative for 3D content
</h3>
<h3>
For authors
</h3>
<aside class="note">
<p>
This section would eventually be moved to [[HTML-ARIA]].
</p>
</aside>
<table class="complex data">
<caption>
Rules of ARIA attribute usage by HTML element ([[HTML-ARIA]])
</caption>
<thead>
<tr>
<th>
HTML element
</th>
<th>
Implicit ARIA semantics
</th>
<th>
ARIA roles, states and properties which MAY be used
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
[^model^]
</td>
<td>
TBD
</td>
<td>
TBD
</td>
</tr>
</tbody>
</table>
<h3>
For implementers
</h3>
<aside class="note">
<p>
This section would eventually move to [[HTML-AAM-1.0]].
</p>
</aside>
<table class="complex data">
<caption>
[^model^]
</caption>
<tbody>
<tr>
<th>
[[wai-aria-1.2]]
</th>
<td>
No corresponding role
</td>
</tr>
<tr>
<th>
<a href=
"https://msdn.microsoft.com/en-us/library/dd373608%28v=VS.85%29.aspx">
MSAA</a> + <a href=
"http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/">
IAccessible2</a>
</th>
<td>
<div class="general">
Not mapped
</div>
</td>
</tr>
<tr>
<th>
<a href=
"https://msdn.microsoft.com/en-us/library/ms726297%28v=VS.85%29.aspx">
UIA</a>
</th>
<td>
<div class="general">
Not mapped
</div>
</td>
</tr>
<tr>
<th>
<a href="https://gnome.pages.gitlab.gnome.org/atk/">ATK</a>
</th>
<td>
<div class="general">
Not mapped
</div>
</td>
</tr>
<tr>
<th>
<a href=
"https://developer.apple.com/reference/appkit/nsaccessibility">AX</a>
</th>
<td>
<div class="general">
Not mapped
</div>
</td>
</tr>
<tr>
<th>
Comments
</th>
<td></td>
</tr>
</tbody>
</table>
</section>
<section>
<h2>
MIME
</h2>
<aside class="issue" data-number="37"></aside>
<h3>
MIME Sniffing
</h3>
<aside class="issue" data-number="38"></aside>
</section>
<section id="conformance"></section>
<section id="issue-summary"></section>
<section class="informative">
<h2>
Change log
</h2>
<p>
The following are some significant changes that were made since the
initial proposal:
</p>
<script class="remove">
const ignoredHashes = [];
function removeCommits(entry) {
const { message, hash } = entry;
for (const ignoredHash of ignoredHashes) {
if (ignoredHash.startsWith(hash)) {
return false;
};
}
return !/^editorial|^chore|^\[chore|^fix|^refactor|^tests?|^docs|^typo|^nit/i.test(message);
}
</script> <rs-changelog from="initial" filter=
"removeCommits"></rs-changelog>
</section>
<section id="index"></section>
</body>
</html>