- From: Patrick H. Lauke <redux@splintered.co.uk>
- Date: Mon, 25 Apr 2016 14:48:42 +0100
- To: public-webapps@w3.org
On 25/04/2016 03:31, Chris Van Wiemeersch wrote: > Do we want to know the value of the press? Does the API for the Steam > Controller, for example, return the force of the press as a float? The > reason I ask is because with Touch events, there's a `force` property on > the `Touch` interface: > https://developer.mozilla.org/en-US/docs/Web/API/Touch/force Likewise, Pointer Events have "pressure" https://w3c.github.io/pointerevents/#widl-PointerEventInit-pressure P > We should probably introduce something similar to the Gamepad API. > > The `Gamepad.vibrate` proposal generally looks good, but I have a few > concerns. `navigator.vibrate(pattern)` works well for pulse vibrations > of varying durations and pause intervals, but the API doesn't allow the > following: > > 1. vibrating at a higher/lower _strength_ (i.e., every vibration is > emitted at the same strength, but you might want to do neat effects such > as fading in and out) > 2. selecting which vibration motors (haptic axes) to vibrate (e.g., with > controllers that allow haptic feedback in different regions, such as > left/right/top/bottom; a perfect example is the PlayStation DualShock > controllers) > > > This is pretty basic as far as gamepad haptics go, but it's also > provides a lowest common denominator interface that should be > supportable by anything with a motor in it. It gives up some granularity > (For example, it doesn't allow developers to trigger the two motors in > an Xbox controller individually), but it provides a clean, universal > interface that's easy to use and mimics existing features on the web > platform. > > Brandon, you addressed my #2 above, but my concern is once the API is > changed, it's going to be hard to change it again. If you take a look at > all the content libraries out there for the Gamepad API, there's a > ridiculous amount of logic and special casing web developers are having > to do just between the Firefox and Chrome implementations - and between > Windows and Mac. > > We already have `GamepadButton`, but perhaps we should have a > `GamepadAxis` and _there_ is where we should add a `vibrate` property > for each haptic axis. There are probably other ways of handling this, > but just a thought. > > Those are my initial thoughts. If I think of anything else, I'll let > y'all know. > > > On Thu, Apr 21, 2016 at 10:14 PM, Brandon Jones <bajones@google.com > <mailto:bajones@google.com>> wrote: > > I'd like to propose the addition of several new features to the > Gamepad API, primarily born from needs that have been identified > while developing the WebVR spec > <http://mozvr.github.io/webvr-spec/>, but which also cover topics > that have been under discussion in the past but deemed lower > priority for one reason or another. > > First, I'm proposing that we add an optional "pose" object to the > the Gamepad interface that would expose all the information > necessary to track a controller with 3 Degree of Freedom or 6 Degree > of Freedom tracking capabilities. The primary motivator for > supporting this information is to allow devices like HTC Vive > controllers or Oculus Touch to be exposed, but the same structure > could also expose motion and orientation data for devices such as > Wii, PS3, and PS4 controllers, as well as anything else that had a > gyroscope and/or accelerometer. > > interface *GampadPose* { > readonly attribute Float32Array? position; > readonly attribute Float32Array? linearVelocity; > readonly attribute Float32Array? linearAcceleration; > > readonly attribute Float32Array? orientation; > readonly attribute Float32Array? angularVelocity; > readonly attribute Float32Array? angularAcceleration; > }; > > partial interface *GampadPose* { > readonly attribute GamepadPose? pose; > }; > > Position is given in meters from a device-specific origin. Velocity > and acceleration are given it meters per second, and orientation is > a quaternion. If provided all arrays should have 3 elements to > except the orientation, which has 4. > > The proposed pose interface largely mirrors the VRPose > <http://mozvr.github.io/webvr-spec/#interface-vrpose> interface from > the WebVR spec, but drops the timestamp since that's already > provided on the Gamepad interface itself. The VRPose interface could > conceivably be used directly, but I'm assuming that we'd rather not > have a dependency on a separate work-in-progress spec. > > Second, I'd like to see the API more explicitly support devices that > have touchpads. It's my feeling that the existing axis array is > sufficient for exposing the touch position, but we need a way to > indicate if the touchpad is currently being touched to disambiguate > a value of zero from no input. This can be handled currently by > assigning a button to report pressed = true when the touchpad is > touched, but since many touchpads also can be clicked as a button > you end up with two buttons associated with a single input. I'd like > to proposed that we extend GamepadButton with a "touched" boolean to > make this case explicit. > > interface *GampadButton* { > readonly attribute boolean pressed; > readonly attribute double value; > readonly attribute boolean touched; > }; > > For non-touch controls it seems sensible that this would always > report false. > > Finally, I'd like to propose that we add gamepad vibration controls. > This has been talked about in the past as well, and the thinking has > typically been that the Gamepad API may want to try and use the > Vibration API <https://w3c.github.io/vibration/> somehow instead of > exposing a new interface. However that API doesn't currently have a > way to target anything other than the device's default motor > (usually for a phone), and I don't see there being much interest in > extending it to do so. Still, I don't see much sense in re-inventing > this wheel so I suggest exposing the same interface on the Gamepad > object. > > partial interface *Gampad* { > boolean vibrate (VibratePattern > <https://w3c.github.io/vibration/#idl-def-VibratePattern> pattern); > }; > > This is pretty basic as far as gamepad haptics go, but it's also > provides a lowest common denominator interface that should be > supportable by anything with a motor in it. It gives up some > granularity (For example, it doesn't allow developers to trigger the > two motors in an Xbox controller individually), but it provides a > clean, universal interface that's easy to use and mimics existing > features on the web platform. > > I've included several developers that have been participating in > WebVR's development to provide some feedback from that end of > things. These are some reasonably large additions, but they can be > layered on to the API as it stands today without breaking backwards > compatibility and cover features that have been discussed as > possible additions previously. Hopefully we can figure out a way to > incorporate them that works for everyone. > > --Brandon > > -- Patrick H. Lauke www.splintered.co.uk | https://github.com/patrickhlauke http://flickr.com/photos/redux/ | http://redux.deviantart.com twitter: @patrick_h_lauke | skype: patrick_h_lauke
Received on Monday, 25 April 2016 13:48:56 UTC