การวางแนวของอุปกรณ์และการเคลื่อนไหว

เหตุการณ์การเคลื่อนไหวและการวางแนวของอุปกรณ์ช่วยให้เข้าถึง ตัวตรวจวัดความเร่ง เครื่องวัดการหมุน และเข็มทิศในตัวของอุปกรณ์เคลื่อนที่ได้

เหตุการณ์เหล่านี้ใช้ได้หลายวัตถุประสงค์ เช่น ในการเล่นเกมเพื่อควบคุม ทิศทางหรือการกระทำของตัวละคร เมื่อใช้ร่วมกับตำแหน่งทางภูมิศาสตร์ จะช่วยสร้างการนำทางแบบเลี้ยวต่อเลี้ยวที่แม่นยำยิ่งขึ้นหรือให้ข้อมูลเกี่ยวกับตำแหน่งที่เฉพาะเจาะจงได้

สรุป

  • ตรวจจับด้านบนของอุปกรณ์และวิธีหมุนอุปกรณ์
  • ดูว่าเมื่อใดและอย่างไรจึงจะตอบสนองต่อเหตุการณ์การเคลื่อนไหวและการวางแนว

ด้านใดอยู่ด้านบน

หากต้องการใช้ข้อมูลที่เหตุการณ์การวางแนวและการเคลื่อนไหวของอุปกรณ์ส่งคืน คุณควรทำความเข้าใจค่าที่ระบุ

กรอบอ้างอิงพิกัดโลก

กรอบพิกัดโลกซึ่งอธิบายโดยค่า X, Y และ Z จะสอดคล้องกัน ตามแรงโน้มถ่วงและทิศทางแม่เหล็กมาตรฐาน

ระบบพิกัด
X แสดงทิศทางตะวันออก-ตะวันตก (โดยทิศตะวันออกเป็นค่าบวก)
Y แสดงทิศเหนือ-ใต้ (โดยทิศเหนือเป็นบวก)
Z แสดงทิศทางขึ้น-ลง ซึ่งตั้งฉากกับพื้น (โดยทิศทางขึ้นเป็นค่าบวก)

กรอบพิกัดของอุปกรณ์

ภาพกรอบพิกัดของอุปกรณ์
ภาพกรอบพิกัดของอุปกรณ์

กรอบพิกัดของอุปกรณ์ซึ่งอธิบายโดยค่า x, y และ z จะสอดคล้องกัน โดยอิงตามกึ่งกลางของอุปกรณ์

ระบบพิกัด
X ในระนาบของหน้าจอ ค่าบวกจะอยู่ทางขวา
Y ในระนาบของหน้าจอ ค่าบวกจะอยู่ด้านบน
Z ตั้งฉากกับหน้าจอหรือแป้นพิมพ์ โดยมีทิศทางบวก ออกไป

ในโทรศัพท์หรือแท็บเล็ต การวางแนวของอุปกรณ์จะอิงตาม การวางแนวหน้าจอโดยทั่วไป สำหรับโทรศัพท์และแท็บเล็ต จะอิงตามการวางอุปกรณ์ ในโหมดแนวตั้ง สำหรับคอมพิวเตอร์เดสก์ท็อปหรือแล็ปท็อป ระบบจะพิจารณาการวางแนวโดยอิงตามแป้นพิมพ์

ข้อมูลการหมุนเวียน

ระบบจะแสดงผลข้อมูลการหมุนเป็นมุมออยเลอร์ ซึ่งแสดงถึงจำนวนองศาที่แตกต่างกันระหว่างกรอบพิกัดของอุปกรณ์ และกรอบพิกัดของโลก

อัลฟ่า

ภาพของอัลฟ่าในกรอบพิกัดของอุปกรณ์
ภาพอัลฟ่าในกรอบพิกัดของอุปกรณ์

การหมุนรอบแกน z alpha มีค่าเป็น 0° เมื่อด้านบนของ อุปกรณ์ชี้ไปทางทิศเหนือโดยตรง เมื่อหมุนอุปกรณ์ทวนเข็มนาฬิกา ค่า alpha จะเพิ่มขึ้น

เบต้า

ภาพกรอบพิกัดของอุปกรณ์
ภาพประกอบของเวอร์ชันเบต้าในกรอบพิกัดของอุปกรณ์

การหมุนรอบแกน x beta ค่าจะเป็น 0° เมื่อด้านบนและ ด้านล่างของอุปกรณ์อยู่ห่างจากพื้นผิวโลกเท่ากัน ค่าจะ เพิ่มขึ้นเมื่อเอียงด้านบนของอุปกรณ์เข้าหาพื้นผิวโลก

แกมมา

ภาพกรอบพิกัดของอุปกรณ์
ภาพแกมมาในกรอบพิกัดของอุปกรณ์

การหมุนรอบแกน y ค่า gamma จะเป็น 0° เมื่อขอบด้านซ้ายและขวาของอุปกรณ์อยู่ห่างจากพื้นผิวโลกเท่ากัน ค่าจะ เพิ่มขึ้นเมื่อด้านขวาเอียงเข้าหาพื้นผิวโลก

การวางแนวของอุปกรณ์

เหตุการณ์การวางแนวอุปกรณ์จะแสดงข้อมูลการหมุน ซึ่งรวมถึงปริมาณที่อุปกรณ์เอียงจากด้านหน้าไปด้านหลัง จากด้านหนึ่งไปอีกด้านหนึ่ง และหากโทรศัพท์หรือแล็ปท็อปมีเข็มทิศ ก็จะแสดงทิศทางที่อุปกรณ์หันไป

โปรดใช้เท่าที่จำเป็น ทดสอบเพื่อดูว่าอุปกรณ์รองรับหรือไม่ อย่าอัปเดต UI ในทุกเหตุการณ์การวางแนว แต่ให้ซิงค์กับ requestAnimationFrame แทน

กรณีที่ควรใช้เหตุการณ์การวางแนวอุปกรณ์

เหตุการณ์การวางแนวอุปกรณ์มีประโยชน์หลายอย่าง ตัวอย่างมีดังนี้

  • อัปเดตแผนที่เมื่อผู้ใช้เคลื่อนที่
  • การปรับแต่ง UI เล็กๆ น้อยๆ เช่น การเพิ่มเอฟเฟกต์พารัลแลกซ์
  • ใช้ร่วมกับตำแหน่งทางภูมิศาสตร์เพื่อใช้ในการนำทางแบบเลี้ยวต่อเลี้ยวได้

ตรวจสอบการสนับสนุนและฟังเหตุการณ์

หากต้องการฟัง DeviceOrientationEvent ก่อนอื่นให้ตรวจสอบว่าเบราว์เซอร์รองรับเหตุการณ์หรือไม่ จากนั้นแนบ Listener เหตุการณ์กับออบเจ็กต์ window ที่รอเหตุการณ์ deviceorientation

if (window.DeviceOrientationEvent) {
  window.addEventListener('deviceorientation', deviceOrientationHandler, false);
  document.getElementById('doeSupported').innerText = 'Supported!';
}

จัดการเหตุการณ์การวางแนวของอุปกรณ์

เหตุการณ์การวางแนวอุปกรณ์จะทริกเกอร์เมื่ออุปกรณ์เคลื่อนที่หรือเปลี่ยน การวางแนว โดยจะแสดงข้อมูลเกี่ยวกับความแตกต่างระหว่างอุปกรณ์ในตำแหน่งปัจจุบันกับกรอบพิกัดโลก

โดยปกติแล้ว เหตุการณ์จะแสดงพร็อพเพอร์ตี้ 3 รายการ ได้แก่ alpha, beta และ gamma ใน Safari บนอุปกรณ์เคลื่อนที่ ระบบจะส่งพารามิเตอร์เพิ่มเติม webkitCompassHeading พร้อมกับทิศทางเข็มทิศ

การเคลื่อนไหวของอุปกรณ์

เหตุการณ์การวางแนวอุปกรณ์จะแสดงข้อมูลการหมุน ซึ่งรวมถึงปริมาณที่อุปกรณ์เอียงจากด้านหน้าไปด้านหลัง จากด้านหนึ่งไปอีกด้านหนึ่ง และหากโทรศัพท์หรือแล็ปท็อปมีเข็มทิศ ก็จะแสดงทิศทางที่อุปกรณ์หันไป

ใช้การเคลื่อนไหวของอุปกรณ์เมื่อต้องการการเคลื่อนไหวปัจจุบันของอุปกรณ์ rotationRate มีหน่วยเป็น °/วินาที acceleration และ accelerationWithGravity มีหน่วยเป็น ม./วินาที2 โปรดทราบถึงความแตกต่างระหว่างการติดตั้งใช้งานเบราว์เซอร์

กรณีที่ควรใช้เหตุการณ์การเคลื่อนไหวของอุปกรณ์

เหตุการณ์การเคลื่อนไหวของอุปกรณ์มีประโยชน์หลายอย่าง ตัวอย่างมีดังนี้

  • ท่าทางเขย่าเพื่อรีเฟรชข้อมูล
  • ในเกม ใช้เพื่อทำให้ตัวละครกระโดดหรือเคลื่อนที่
  • สำหรับแอปสุขภาพและการออกกำลังกาย

ตรวจสอบการสนับสนุนและฟังเหตุการณ์

หากต้องการฟัง DeviceMotionEvent ก่อนอื่นให้ตรวจสอบว่าเบราว์เซอร์รองรับเหตุการณ์หรือไม่ จากนั้นแนบ Listener เหตุการณ์กับwindow ออบเจ็กต์ที่รอเหตุการณ์ devicemotion

if (window.DeviceMotionEvent) {
  window.addEventListener('devicemotion', deviceMotionHandler);
  setTimeout(stopJump, 3 * 1000);
}

จัดการเหตุการณ์การเคลื่อนไหวของอุปกรณ์

เหตุการณ์การเคลื่อนไหวของอุปกรณ์จะทริกเกอร์เป็นช่วงๆ และแสดงข้อมูลเกี่ยวกับการหมุน (ในหน่วย °/วินาที) และความเร่ง (ในหน่วย ม./วินาที2) ของอุปกรณ์ ณ เวลานั้น อุปกรณ์บางเครื่องไม่มีฮาร์ดแวร์ เพื่อยกเว้นผลของแรงโน้มถ่วง

เหตุการณ์จะแสดงผลพร็อพเพอร์ตี้ 4 รายการ accelerationIncludingGravity acceleration ซึ่งไม่รวมผลกระทบจาก แรงโน้มถ่วง rotationRate และ interval

เช่น มาดูโทรศัพท์ที่วางอยู่บนโต๊ะเรียบโดยหันหน้าจอขึ้น

รัฐ การหมุน ความเร่ง (ม./วินาที2) ความเร่งเนื่องจากแรงโน้มถ่วง (ม./วินาที2)
ไม่เคลื่อนไหว [0, 0, 0] [0, 0, 0] [0, 0, 9.8]
เคลื่อนตัวขึ้นสู่ท้องฟ้า [0, 0, 0] [0, 0, 5] [0, 0, 14.81]
เลื่อนไปทางขวาเท่านั้น [0, 0, 0] [3, 0, 0] [3, 0, 9.81]
เลื่อนขึ้นและไปทางขวา [0, 0, 0] [5, 0, 5] [5, 0, 14.81]

ในทางกลับกัน หากถือโทรศัพท์โดยให้หน้าจอตั้งฉากกับพื้นและผู้ชมมองเห็นหน้าจอโดยตรง

รัฐ การหมุน ความเร่ง (ม./วินาที2) ความเร่งเนื่องจากแรงโน้มถ่วง (ม./วินาที2)
ไม่เคลื่อนไหว [0, 0, 0] [0, 0, 0] [0, 9.81, 0]
เคลื่อนตัวขึ้นสู่ท้องฟ้า [0, 0, 0] [0, 5, 0] [0, 14.81, 0]
เลื่อนไปทางขวาเท่านั้น [0, 0, 0] [3, 0, 0] [3, 9.81, 0]
เลื่อนขึ้นและไปทางขวา [0, 0, 0] [5, 5, 0] [5, 14.81, 0]

ตัวอย่าง: การคำนวณความเร่งสูงสุดของวัตถุ

วิธีหนึ่งในการใช้เหตุการณ์การเคลื่อนไหวของอุปกรณ์คือการคำนวณความเร่งสูงสุด ของวัตถุ เช่น ความเร่งสูงสุดของคนที่กระโดดคือเท่าใด

if (evt.acceleration.x > jumpMax.x) {
  jumpMax.x = evt.acceleration.x;
}
if (evt.acceleration.y > jumpMax.y) {
  jumpMax.y = evt.acceleration.y;
}
if (evt.acceleration.z > jumpMax.z) {
  jumpMax.z = evt.acceleration.z;
}

หลังจากแตะปุ่มไปเลย ผู้ใช้จะได้รับคำสั่งให้กระโดด ในระหว่างนั้น หน้าเว็บจะจัดเก็บค่าการเร่งความเร็วสูงสุด (และต่ำสุด) และหลังจาก การกระโดด จะบอกผู้ใช้ถึงการเร่งความเร็วสูงสุด

ความคิดเห็น