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

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

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

สรุป

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

ปลายสายข้างไหนเป็นปลายสาย

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

เฟรมพิกัด Earth

เฟรมพิกัด Earth ซึ่งอธิบายด้วยค่า 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!';
}

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

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

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

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

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

ใช้การเคลื่อนไหวของอุปกรณ์เมื่อต้องการการเคลื่อนไหวปัจจุบันของอุปกรณ์ rotationRate แสดงเป็น °/วินาที ส่วน acceleration และ accelerationWithGravity แสดงเป็น m/วินาที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;
}

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

ความคิดเห็น