XRSession: sự kiện squeezestart
Khả dụng hạn chế
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Experimental: This is an experimental technology
Check the Browser compatibility table carefully before using this in production.
Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.
Sự kiện squeezestart của WebXR được gửi đến một XRSession khi người dùng bắt đầu một hành động bóp chính trên một trong các nguồn đầu vào của nó.
Các hành động bóp chính là các hành động nhằm biểu thị việc nắm hoặc bóp bằng tay và có thể được mô phỏng bằng cò trên bộ điều khiển cầm tay.
Cú pháp
Sử dụng tên sự kiện trong các phương thức như addEventListener(), hoặc thiết lập một thuộc tính trình xử lý sự kiện.
addEventListener("squeezestart", (event) => { })
onsqueezestart = (event) => { }
Loại sự kiện
Một XRInputSourceEvent. Kế thừa từ Event.
Thuộc tính sự kiện
Ngoài các thuộc tính được liệt kê bên dưới, các thuộc tính từ giao diện cha, Event, cũng có sẵn.
frameRead only-
Một đối tượng
XRFramecung cấp thông tin cần thiết về khung hình sự kiện trong đó sự kiện xảy ra. Khung hình này có thể đã được kết xuất trong quá khứ thay vì là một khung hình hiện tại. Vì đây là khung hình sự kiện, không phải khung hình hoạt ảnh, bạn không thể gọiXRFrame.getViewerPose()trên nó; thay vào đó, sử dụnggetPose(). inputSourceRead only-
Một đối tượng
XRInputSourcecho biết nguồn đầu vào nào đã tạo ra sự kiện đầu vào.
Mô tả
>Kích hoạt
Được kích hoạt khi người dùng bắt đầu bóp bộ điều khiển, thực hiện cử chỉ tay mô phỏng việc nắm bắt thứ gì đó hoặc sử dụng (bóp) cò.
Trường hợp sử dụng
Sự kiện squeezestart được gửi cho biết người dùng đã bắt đầu một hành động bóp.
Nếu hành động bóp chính kết thúc thành công, phiên được gửi một sự kiện squeeze.
Một sự kiện squeezeend được gửi để cho biết rằng hành động bóp không còn diễn ra. Điều này được gửi bất kể hành động bóp có thành công hay không.
Ví dụ
Ví dụ sau sử dụng addEventListener() để thiết lập trình xử lý cho các sự kiện bóp: squeezestart, squeezeend, và squeeze. Đoạn mã này là cốt lõi của một trình xử lý sự kiện để cho phép người dùng nắm các đối tượng trong cảnh và di chuyển chúng xung quanh.
Trong trường hợp này, một hàm duy nhất được sử dụng để xử lý cả ba sự kiện, cho phép chúng chia sẻ mã nhất định giống nhau bất kể nhận được sự kiện nào trong ba sự kiện. Chỉ sau khi hoàn thành các tác vụ đó, hàm onSqueezeEvent() dưới đây mới phân phối hành động ra một hàm chuyên biệt để xử lý.
Sau khi kiểm tra để đảm bảo sự kiện nhận được là sự kiện tracked-pointer (loại duy nhất chúng ta xử lý ở đây), pose của tia mục tiêu được lấy bằng getPose().
Nếu pose tia mục tiêu được lấy thành công, mã sau đó sử dụng giá trị của thuộc tính Event type để điều khiển đến một hàm phù hợp để xử lý sự kiện đã nhận:
- Đối với các sự kiện
squeezestart, một hàmmyBeginTracking()được gọi vớimatrixcủa pose tia mục tiêu. HàmmyBeginTracking()có thể sẽ bắt đầu quá trình trình bày kéo đối tượng, sử dụng biến đổi để thực hiện kiểm tra va chạm, xác định đối tượng nào để nhặt.myBeginTracking()trả về một đối tượng biểu diễn đối tượng mà người dùng đã bắt đầu kéo. - Khi nhận được sự kiện
squeeze, hàmmyDropObject()được gọi với đối tượng mục tiêu và biến đổi pose tia mục tiêu hiện tại làm đầu vào. Điều này đặt đối tượng vào vị trí mới trong thế giới và kích hoạt bất kỳ hiệu ứng nào có thể phát sinh, như lên lịch hoạt ảnh của tia nước nếu thả trong nước, v.v. - Sự kiện
squeezeenddẫn đến việc gọi một hàmmyStopTracking()với đối tượng đang kéo và biến đổi pose tia mục tiêu cuối cùng.
xrSession.addEventListener("squeezestart", onSqueezeEvent);
xrSession.addEventListener("squeeze", onSqueezeEvent);
xrSession.addEventListener("squeezeend", onSqueezeEvent);
function onSqueezeEvent(event) {
let source = event.inputSource;
let targetObj = null;
if (source.targetRayMode !== "tracked-pointer") {
return;
}
let targetRayPose = event.frame.getPose(source.targetRaySpace, myRefSpace);
if (!targetRayPose) {
return;
}
switch (event.type) {
case "squeezestart":
targetObj = myBeginTracking(targetRayPose.matrix);
break;
case "squeeze":
myDropObject(targetObj, targetRayPose.matrix);
break;
case "squeezeend":
myStopTracking(targetObj, targetRayPose.matrix);
break;
}
}
Bạn cũng có thể thiết lập một trình xử lý cho các sự kiện này bằng cách thiết lập các thuộc tính trình xử lý sự kiện của đối tượng XRSession thành một hàm xử lý sự kiện:
xrSession.onsqueezestart = onSqueezeEvent;
xrSession.onsqueeze = onSqueezeEvent;
xrSession.onsqueezeend = onSqueezeEvent;
Thông số kỹ thuật
| Thông số kỹ thuật |
|---|
| WebXR Device API> # eventdef-xrsession-squeezestart> |
| WebXR Device API> # dom-xrsession-onsqueezestart> |