การจำลองการสั่นสะเทือน (จากเช่นโรคพาร์กินสัน) ด้วยเมาส์บนหน้าเว็บ?


204

ฉันกำลังทำงานเพื่อวางรากฐานที่สร้างความตระหนักในการเข้าถึงอินเทอร์เน็ต สำหรับงานนำเสนอเราต้องการเสนอการประชุมเชิงปฏิบัติการขนาดเล็กที่จำลองความพิการ / ความบกพร่องต่าง ๆ ให้กับผู้คน สิ่งนี้ทำได้ผ่านเว็บไซต์ที่สร้างขึ้นเป็นพิเศษสำหรับงานนำเสนอนี้

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

ตอนนี้ฉันต้องการย้ายเคอร์เซอร์ของเมาส์ไปในทางที่ไม่สามารถคาดเดาได้ดังนั้นจึงเป็นเรื่องยากสำหรับคนที่จะคลิกปุ่มเล็ก ๆ เนื่องจากจาวาสคริปต์ไม่อนุญาตให้ย้ายเคอร์เซอร์ของเมาส์โดยตรงฉันกำลังมองหาวิธีอื่นเพื่อให้ได้สิ่งนี้ ฉันคิดตามแนวคิดต่อไปนี้:

  • การใช้ไดรเวอร์ / ยูทิลิตี้ของเมาส์เพื่อจำลองการสั่นของเมาส์
  • ซ่อนเคอร์เซอร์ของเมาส์ผ่าน CSS วางภาพเคลื่อนไหว GIF ของเคอร์เซอร์เมาส์เขย่าที่ตำแหน่งของเคอร์เซอร์ดั้งเดิม (ด้วย JavaScript) จากนั้นทำให้ลิงก์เป้าหมายสามารถคลิกได้ทุก ๆ วินาทีไม่กี่วินาที อย่างน้อยก็จะให้ความรู้สึกราวกับว่ามีคนคลิกอยู่เสมอในช่วงเวลาที่ผิด

ในขณะที่ความคิดแรกนั้นค่อนข้างเจ๋งฉันก็ไม่สามารถหาเครื่องมือแบบนี้ได้ไม่ว่าจะเป็นสำหรับ Mac หรือ Windows และฉันไม่มีทักษะในการเขียนโปรแกรมด้วยตัวเอง

ความคิดที่สองดูเหมือนจะค่อนข้างงุ่มง่าม แต่มันจะทำให้ได้ผลตามที่ต้องการ

ใครมีความคิดอื่นบ้าง


35
จริงๆแล้วคุณสามารถควบคุมตำแหน่งเคอร์เซอร์ได้ (เช่นเดียวกับที่เลียนแบบ) ด้วยPointer Lock API
Stuart P. Bentley

2
ลองมองหาที่developer.mozilla.org/en-US/docs/Web/API/... การเชื่อมโยงโดยตรงกับการสาธิตเป็นmdn.github.io/pointer-lock-demo ตราบใดที่มันเป็นที่ยอมรับได้สำหรับวัตถุประสงค์ของคุณที่จะบอกผู้ใช้ให้คลิกที่ภาพวาดบนผืนผ้าใบและอนุญาตให้หน้าเว็บปิดการใช้งานเคอร์เซอร์ของเมาส์คุณอาจต้องการใช้รหัสของคุณออกจากสิ่งนี้
Aristocrates

5
คำถามที่สร้างความตระหนักในหมู่พวกเรานักพัฒนาเว็บ ขอบคุณที่ถาม! คุณคิดว่าปุ่มควรมีขนาดใหญ่แค่ไหนจึงจะสามารถคลิกได้
Ideogram

4
แค่ระดับการสั่นสะเทือน: มีสองประเภทพื้นฐาน - "การสั่นสะเทือนที่จำเป็น" และการสั่นสะเทือนของ Parkinson - และพวกเขาแตกต่างกันอย่างสิ้นเชิง "แรงสั่นสะเทือนที่สำคัญ" (ซึ่งไม่ใช่เงื่อนไขของผู้สูงอายุอย่างหมดจด) คือการสั่นสะเทือน "เจตนา" ซึ่งหมายความว่ามันชัดเจนเมื่อบุคคลพยายามทำบางสิ่งบางอย่างและยิ่งยากที่บุคคลจะพยายามควบคุม ในทางกลับกันการสั่นของ PD นั้นเกิดขึ้นที่ที่พักเป็นหลักและการสั่นสะเทือนมักไม่ชัดเจนเมื่อบุคคลพยายามทำบางสิ่ง (แม้ว่าความแข็งเนื่องจาก PD อาจมีอยู่)
Hot Licks

2
ฉันโพสต์รุ่น linux ที่ใช้ xdotool เพื่อควบคุมเมาส์ แต่มีเครื่องมือคล้ายกันสำหรับ windows ที่เรียกว่า autoit มันดูเรียบง่ายและมีแท็ก [autoit] นอกจากนี้ดูเหมือนว่าคุณต้องการ 2 รุ่น หนึ่งที่สั่นมากขึ้นจนกว่าการเคลื่อนไหวจะเริ่มขึ้นแล้วสงบลงเล็กน้อยในขณะที่อีกการเคลื่อนไหวจะค่อนข้างเสถียรจนกว่าการเคลื่อนไหวจะเริ่มขึ้น
technosaurus

คำตอบ:


148

ฉันทำสาธิตอย่างรวดเร็วของสิ่งที่คุณหวังว่าจะสามารถฐานรหัสของคุณในการใช้ตัวชี้ล็อค API

ฉันแยกส่วนrepo ตัวชี้ - ล็อค - สาธิตและปรับเปลี่ยนเพื่อเพิ่มองค์ประกอบการเคลื่อนไหวแบบสุ่ม

นี่คือลิงค์ไปยังหน้า GitHub ของฉัน: https://aristocrates.github.io/pointer-lock-demo
และนี่คือลิงค์ไปยัง repo ของฉัน: https://github.com/aristocrates/pointer-lock-demo

รหัส JavaScript ที่มีความสำคัญที่มีอยู่ในapp.jsในcanvasLoop(e)วิธีการ

สิ่งเดียวที่ฉันเปลี่ยนไปจากการสาธิตดั้งเดิมคือหลังจากผ่านสาย

x += movementX * 2;
y += movementY * 2;

ฉันเพิ่มสองบรรทัดเพื่อแสดงการเคลื่อนไหวแบบสุ่ม:

x += Math.floor(Math.random()*3 - 1);
y += Math.floor(Math.random()*3 - 1);

ยังมีอีกหลายสิ่งที่คุณสามารถปรับปรุงได้ แต่หวังว่าสิ่งนี้จะช่วยให้คุณเริ่มต้นได้


36
ตามที่ทราบในฟังก์ชั่นการเคลื่อนไหวแบบสุ่มนั้นไม่เหมือนกับมือที่จับ ด้วยการเคลื่อนไหวแบบสุ่มตัวชี้สามารถลอยข้ามหน้าจอ เมื่อจับมือตัวชี้จะสั่นไปรอบ ๆ จุดศูนย์กลาง
zzzzBov

5
เป็นที่น่าสังเกตว่าการสนับสนุนเบราว์เซอร์สำหรับ Pointer Lock Api นั้นยอดเยี่ยม - มันจะไม่ทำงานใน Internet Explorer หรือ Safari
Steve Sanders

3
ฉันไม่พบเวลาลองด้วยตนเอง แต่บางทีคุณอาจรู้จักอันนี้: API ตัวล็อคยังทำงานนอกพื้นที่วาดภาพหรือไม่ หรือมันถูก จำกัด อยู่กับผืนผ้าใบ?
Joshua Muheim

8
การนำไปปฏิบัติที่สมจริงยิ่งขึ้นจะติดตามตำแหน่ง "ของจริง" ของเคอร์เซอร์และเคลื่อนที่แบบสุ่มภายในวงกลมรอบ ๆ นั้น แต่อาจซับซ้อนเกินไป
tckmn

1
@ Chris Chrome Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.ตอนนี้พ่น ดูเหมือนว่า jsFiddle กำลังฝังเนื้อหาในกรอบ sandboxed (เช่นไม่อนุญาตให้ล็อคตัวชี้ผ่าน <iframe sandbox="webkit-allow-pointer-lock">ดูเอกสาร ) ลองวางตัวอย่างไว้ในหน้าเดียวที่ไม่ได้ถูก Sandbox
ComFreek

36

วิธีที่ไม่ใช่จาวาสคริปต์

ที่จริงแล้วฉันชอบวิธีแก้ปัญหาซึ่งอาจเป็นไปตามจาวาสคริปต์เนื่องจากมีความเกี่ยวข้องกับเว็บมากขึ้นและมีโอกาสที่ดี - ระบบปฏิบัติการอิสระ อย่างไรก็ตามฉันคิดว่าจะแก้ไขปัญหาของคุณสำหรับเบราว์เซอร์ทั้งหมดได้อย่างไรเนื่องจากในกรณีนี้โซลูชัน javascript จะปรับได้ยากสำหรับเบราว์เซอร์ที่เป็นไปได้ทั้งหมด (ฉันไม่แน่ใจว่าเป็นไปได้หรือไม่)

ดังที่คุณได้กล่าวมามีวิธีอื่น - นั่นคือเพื่อเลียนแบบพฤติกรรมในระดับระบบปฏิบัติการ นี่ก็มีข้อดีอีกอย่างเช่นกัน - คุณอาจมั่นใจได้ว่าเบราว์เซอร์นั้นดูเหมือนมนุษย์ 100% (เพราะเป็นคนขับที่กำลังส่งสัญญาณ) ดังนั้นคุณอาจใช้โซลูชันที่ใช้ไดรเวอร์ / อุปกรณ์กับเบราว์เซอร์ใด ๆ (หรือแม้กระทั่งในสถานการณ์เมื่อปิดการใช้งานจาวาสคริปต์)

ลินุกซ์

น่าเสียดายที่การเกี่ยวข้องกับไดรเวอร์ / อุปกรณ์ทำให้การพึ่งพาระบบปฏิบัติการเกิดขึ้นทันที ดังนั้นสำหรับแต่ละระบบปฏิบัติการคุณจะต้องมีโซลูชันของตัวเอง ในโพสต์นี้ฉันมุ่งเน้นโซลูชันที่ใช้ Linux (ดังนั้นจะทำงานกับ Linux) - และ Mac OS เล็กน้อย ด้วย Linux คุณสามารถเขียนเหตุการณ์ไปยังอุปกรณ์ได้อย่างชัดเจนดังนั้นด้านล่างเป็นตัวอย่างของฟังก์ชั่นที่มีลูปหลัก:

int main()
{
    struct input_event event, event_end;

    int  fd = open("/dev/input/event4", O_RDWR);
    long ma = getInteger("Enter max amplitude [points, 0..50]: ", 0, 50);
    long ta = getInteger("Enter max wait time [usecs , 0..200000]: ", 0, 200000);
    if (fd < 0)
    {
        printf("Mouse access attempt failed:%s\n", strerror(errno));
        return -1;
    }
    memset(&event, 0, sizeof(event));
    memset(&event, 0, sizeof(event_end));
    gettimeofday(&event.time, NULL);
    event.type = EV_REL;
    gettimeofday(&event_end.time, NULL);
    event_end.type = EV_SYN;
    event_end.code = SYN_REPORT;
    event_end.value = 0;
    while(1)
    {
        event.code  = rand() % 2 ? REL_X : REL_Y;
        event.value = (rand() % 2 ? -1 : 1) * randomTill(ma);
        write(fd, &event, sizeof(event));
        write(fd, &event_end, sizeof(event_end));
        usleep(randomTill(ta));
    }
    close(fd);
    return 0;
}

ฉันรหัสเต็มสำหรับปัญหาพบได้ที่นี่ โปรแกรมจะถามแอมพลิจูดของ "แรงสั่นสะเทือน" และความถี่ของมัน (ดังนั้นจะใช้เวลากี่วินาทีในหน่วยไมโครวินาทีระหว่าง "แรงสั่นสะเทือน") เพื่อเลียนแบบสถานการณ์มันจะบังคับให้เมาส์เลื่อนแบบสุ่มเพื่อหา0..Xคะแนนในทิศทางแบบสุ่ม (ขึ้น - ลง - ซ้าย - ล่าง) และรอ0..Yไมโครวินาทีแบบสุ่มจนกระทั่ง "สั่น" ถัดไปมีXความกว้างของ "แรงสั่นสะเทือน" และYความถี่ของแรงสั่นสะเทือน "

อีกสิ่งหนึ่งคือการปรับโปรแกรมสำหรับระบบของคุณ โปรแกรมคือ "จำลอง" และไม่สามารถตรวจจับเมาส์ได้ด้วยตัวเองดังนั้นจึง"/dev/input/event4"เป็นรหัสตาย หากต้องการตระหนักถึงสิ่งที่อาจเป็นตัวระบุสำหรับระบบของคุณคุณอาจลอง:

user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3 
H: Handlers=mouse1 event4

และเพื่อให้เป็นไปได้"event3"และ"event4"- แต่สำหรับระบบของคุณที่อาจมีค่าอื่น ๆ ดังนั้นหากที่แตกต่างจากที่ใช้ในปัจจุบันในรหัส C เพียงแค่เปลี่ยนสายที่สอดคล้องกัน (ดังนั้นสอดคล้องกับint fd = open("/dev/input/event4", O_RDWR);และวางอุปกรณ์ของคุณแทนevent4)

การสาธิต GIF สำหรับโปรแกรมนี้ (อัตราเฟรมต่ำโชคไม่ดีเพื่อให้ภาพที่มีขนาดไม่ใหญ่เกินไป) ที่นี่

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

user@host:/path$ gcc -std=gnu99 file.c -o m

ที่file.cชื่อของไฟล์ซอร์สโค้ด C ของคุณจากนั้นคุณจะได้รับการปฏิบัติการที่เรียกว่าmในไดเรกทอรีของคุณ เป็นไปได้มากว่าคุณจะต้องมีสิทธิ์ในการเขียนลงในอุปกรณ์เมาส์โดยตรงดังนั้นคุณอาจใช้sudo:

user@host:/path$ sudo ./m

ระบบปฏิบัติการอื่น ๆ

ตรรกะจะยังคงเหมือนเดิม:

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

แค่นั้นแหละ. ตัวอย่างเช่น Mac OS มีวิธีการทำงานกับเมาส์ของตัวเอง (ไม่เหมือน Linux, Mac ก็ไม่ได้procfsดีเหมือนกัน) มันอธิบายไว้ที่นี่แล้ว

บทสรุป

จะมีอะไรดีกว่า - javascript หรืออุปกรณ์ที่มุ่งเน้น - ขึ้นอยู่กับคุณเพราะเงื่อนไขบางอย่าง (เช่น cross-browser หรือ cross-OS) อาจเป็นตัวตัดสินทุกอย่างในกรณีนี้ ดังนั้นฉันจึงได้ให้แนวทางพร้อมกับตัวอย่างการทำงานบางอย่างเกี่ยวกับวิธีการนำไปใช้ในระดับ OS ประโยชน์ที่นี่คือโซลูชันนั้นข้ามเบราว์เซอร์ แต่เป็นค่าใช้จ่ายที่เรามีโปรแกรม OS ผูกมัด


ขอบคุณมากสำหรับโพสต์ที่มีรายละเอียดมาก ฉันสงสัยว่าเราจะแสดงบนแท็บเล็ต (android หรือ ios) ดังนั้นเราจะไม่สามารถเปลี่ยนพฤติกรรมเมาส์ในระดับระบบปฏิบัติการ แต่น่าสนใจมาก ๆ เลย!
Joshua Muheim

53
แล้วคุณจะสาธิตให้เห็นเมาส์ตัวสั่นบนอุปกรณ์หน้าจอสัมผัสได้อย่างไร?
ลิ้มรส

6
@ Davor สุจริตฉันสงสัยอย่างมากว่าคนที่มีปัญหากับการสั่นสะเทือน / มือสั่นคลอนจะใช้อุปกรณ์สัมผัสเว้นแต่ว่าพวกเขาต้องการที่จะขับรถบ้าตัวเองโดยเจตนา
Chris Cirefice

2
@ChrisCirefice: หรือถูกบังคับเพราะพวกเขาต้องใช้หนึ่งในพันล้านอุปกรณ์ที่นั่นเพื่อทำให้ชีวิตของเราดีขึ้นและใช้หน้าจอสัมผัส ... จำไว้ว่านี่คือการสร้างความตระหนักถึงปัญหาที่คนเหล่านี้มีปัญหากับ ที่.
PlasmaHH

@PlasmaHH OP ไม่ได้พูดถึงว่านี่คือการสร้างความตระหนักให้กับผู้ที่มีแรงสั่นสะเทือนและความยากลำบาก (โดยเฉพาะ) ด้วยอุปกรณ์หน้าจอสัมผัส และอีกครั้งผมไม่คิดว่าทุกคนที่จริงมีปัญหาเกี่ยวกับการสั่นสะเทือนเป็นพอร้ายที่จะพยายามที่จะใช้มือถืออุปกรณ์หน้าจอสัมผัส มีอุปกรณ์ที่ใช้งานง่ายกว่ามากเช่นโทรศัพท์ที่มีปุ่มขนาดใหญ่ (เชิงกล) ระบบปฏิบัติการส่วนใหญ่รวมการนำทางด้วยคำพูด (เช่นการรู้จำเสียง - Windows OS) ฉันคิดว่าผู้ที่ทุกข์ทรมานอย่างจริงจังจะใช้เครื่องมือเหล่านั้นแทน iPhone
Chris Cirefice

23

ฉันทำสิ่งนี้เป็นเรื่องตลกครั้งหนึ่งบนPuppy Linux Forumและได้รับความคิดเห็นที่:

ผู้ที่มีพาร์กินสันจะไม่คิดว่ามันตลก !!!

รักษาที่นี่เป็นเพียง cntrl-C โชคดี

นี่คือเชลล์สคริปต์ที่ต้องการxdotool

#!/bin/sh
while :; do
   xdotool mousemove_relative -- -$(($RANDOM % 10)) $(($RANDOM % 10))
   xdotool mousemove_relative -- $(($RANDOM % 10)) -$(($RANDOM % 10))
   sleep ${1:-.1} #adjust this as necessary for effect
done

ตั้งชื่อเป็น parkinson_sim และเรียกใช้ด้วยอาร์กิวเมนต์ตัวเลือกสำหรับช่วงเวลาระหว่าง tremors ซึ่งสามารถเป็น 0.001 ถึง 999.0

parkinson_sim [time_between_tremors_in_seconds] #default คือ 0.1

ฉันทำผิดพลาดในการคลิกที่ตัวเองแทนที่จะเรียกใช้จากบรรทัดคำสั่งและค้นพบอย่างรวดเร็วว่ามันน่าผิดหวังแค่ไหน ฉันพยายามหลายครั้งที่จะเปิดหน้าต่างเทอร์มินัลเพื่อฆ่ามัน


1
คุณอาจต้องการแทนที่โคลอนด้วยบางอย่างเช่น "sleep 0.01" เพื่อ จำกัด การใช้งาน cpu และความเร็วเนื่องจากบนอุปกรณ์ของฉันมันทำให้การกระโดดอย่างรวดเร็วไม่สมจริงด้วยโค้ดของคุณ
nonchip

1
@nonchip - ขอบคุณสำหรับข้อมูลฉันไม่เคยวิ่งมานานพอที่จะหาการใช้ซีพียู เพิ่มการนอนหลับให้กับร่างกาย
technosaurus

คุณรู้หรือไม่ว่าใน Linux distros ส่วนใหญ่คุณสามารถเปิดเครื่องโดยใช้คำสั่งคีย์บอร์ดได้ไหม?
justhalf

@justhalf ตามค่าเริ่มต้นของ Puppy ในเวลานั้นทางลัดของเทอร์มินัลคือการกด`ในหน้าต่าง ROX-Filer ใช้ความพยายามสองสามครั้งเพื่อเปิดดังนั้นฉันจึงใช้แป้นพิมพ์เพื่อเปิดเมนู หลังจากนั้นไม่นานฉันก็สร้างภูตควบคุมเสียงขั้นพื้นฐานโดยใช้ pockets ฟินซ์_คอนติเนนตัลและเชลล์ประมาณ 10 บรรทัด
technosaurus

while :; do ...; sleep $time; doneควรจะเกือบตลอดเวลาwhile sleep $time; do ...; doneเพราะเมื่อผู้ใช้กด Ctrl-C คำสั่งในการดำเนินการในปัจจุบันจะเป็นอย่างแน่นอนsleepและเชลล์จะไม่สิ้นสุดสคริปต์เสมอเมื่อผู้ใช้ต้องการ สิ่งนี้เกิดขึ้นได้อย่างยอดเยี่ยมระหว่างการทดสอบเชลล์แบบโต้ตอบ แต่บางครั้งก็สามารถเกิดขึ้นได้แม้ในสคริปต์ while xdotool ... && xdotool ... && sleep ...; do :; doneแม้จะดีกว่า

16

แนวคิดที่สองของคุณ (ซ่อนเคอร์เซอร์) อยู่กึ่งกลางกับแนวคิดที่ฉันคิดว่าอาจทำงานได้ดีสำหรับคุณ:

  • ซ่อนเคอร์เซอร์ของเมาส์ผ่าน CSS ตามที่คุณแนะนำ ( cursor:noneIIRC)
  • แทนที่จะเป็น GIF ที่มีการสั่นไหวของเคอร์เซอร์ให้ใช้รูปภาพ + การจัดตำแหน่งแบบสัมบูรณ์ + CSS + JS เพื่อเลียนแบบตัวชี้เมาส์ เช่นติดตามเมาส์ไปรอบ ๆ หน้าและวางภาพเคอร์เซอร์ที่เคอร์เซอร์ของเมาส์จะอยู่ตรงนั้น

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

ในที่สุด: สำหรับการควบคุมสิ่งที่คุณกำลังเขียนโปรแกรม (ลิงก์ ฯลฯ ):

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

โบนัสหลักอย่างหนึ่งของการติดตั้งนี้: 'เคอร์เซอร์สั่นคลอน' ของคุณจะปรากฏบนอุปกรณ์ระบบสัมผัสซึ่งจะไม่มีเคอร์เซอร์ขึ้นต้น


แก้ไข:

ตาม Michael Theriot's (สะอาดและเป็นประโยชน์มาก!) ฐาน JSFiddle จากความคิดเห็นนี่คือสิ่งที่สั่นสะเทือนอย่างต่อเนื่องด้วยการกวาดตามปกติกระจายรอบตำแหน่งเคอร์เซอร์ปัจจุบัน: http://jsfiddle.net/benmosher/0x4mc64v/4/

( normalอาเรย์เป็นผลมาจากการโทรrnorm(100)ในคอนโซล R ของฉันวิธีที่ง่ายที่สุดที่ฉันคิดใน JS เพื่อสุ่มตัวอย่างจำนวนเต็มแบบกระจายแบบกระจาย)


ข้อมูลเหตุการณ์เมาส์มาตรฐานของ JS: javascript.info/tutorial/…
เบ็นเชอร์เชอร์

ขอบคุณนี่เป็นส่วนเสริมที่คุ้มค่ากับความคิดของฉัน
Joshua Muheim

ซอนั้นสวยงามสำหรับโครงการที่ฉันกำลังทำอยู่แม้ว่านี่จะอายุ 4 ขวบคุณจะรังเกียจที่จะขโมยสิ่งนี้เป็นพื้นฐานสำหรับการจำลองของพาร์คินสันซึ่งเป็นส่วนหนึ่งของโครงการของฉันหรือไม่
เกรแฮมริตชี่

@ GrahamRitchie: สบายดีกับฉัน แต่ Michael Theriot ทำงานส่วนใหญ่ได้แม้ว่า IIRC 😄
Ben Mosher

14

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

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

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


ขอบคุณสำหรับคำแนะนำนี้
Joshua Muheim

1
ฉันชอบแนวคิดนี้ - ตำแหน่งเมาส์สามารถบันทึกได้ตลอดเวลาผ่าน JavaScript จากนั้นคุณสามารถวางแผนการเคลื่อนไหว (ระนาบ XY) และได้รับสถิติพื้นฐานสำหรับสูตร 'tremor_randomness' ที่ถูกต้องมากขึ้นสำหรับ Pointer Lock API หรือสิ่งที่คล้ายกัน สิ่งนี้จะต้องใช้งานอีกเล็กน้อย (ตัวอย่างเช่นดึงตำแหน่ง XY ทุก ๆ 100 มิลลิวินาทีเป็นเวลา 10 วินาที) และการวิเคราะห์ แต่จะให้ผลที่แท้จริงมากกว่าการสุ่มอย่างง่าย สำหรับสาเหตุของคุณมันอาจจะคุ้มค่า
Chris Cirefice

10

แทนที่จะพยายามย้ายตัวชี้คุณสามารถย้ายแอปพลิเคชัน (เว็บเพจ) แทน ฉันเขียนรูปแบบ html ง่ายๆที่มีฟิลด์ป้อนข้อมูลอยู่ในนั้น เมื่อคุณเลื่อนเมาส์ไปยังแบบฟอร์มแบบฟอร์มจะย้าย

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

ฉันใช้ jquery shake effect เพื่อให้ได้สิ่งนี้ จาวาสคริปต์สำหรับเอฟเฟกต์การสั่นมีลักษณะเช่นนี้และทำให้รูปแบบเลื่อนขึ้นและลงเมื่อใดก็ตามที่มีการย้ายเมาส์:

<script type="text/javascript">
    $(document).ready(function() {
        $("#toggle").hover(function () {
            $(this).effect("shake", { direction: "up", times: 1, distance: 40}, 1000);
        });
    });
</script>

แม้ว่ารูปแบบจะเลื่อนขึ้นและลงเท่านั้น แต่ฉันคิดว่ามันมีผลที่ต้องการ คุณสามารถเล่นกับพารามิเตอร์ (ทิศทาง, เวลา, ระยะทาง, และไม่มีชื่อ "1,000" ด้านบน) เพื่อปรับแต่งการเคลื่อนไหวของแบบฟอร์ม


3
ฉันคิดเกี่ยวกับตัวเองเช่นกัน แต่ในขณะที่มันง่ายกว่าที่จะใช้มันไม่ได้แสดงประสบการณ์ "ตัวจริง" ของการสั่นสะเทือน
Joshua Muheim

10

ทำไมไม่ใช้โซลูชันฮาร์ดแวร์? มีหนูบางตัวที่คุณสามารถใส่ตุ้มน้ำหนักเช่น Logitech G500 แทนที่จะใส่น้ำหนักให้ใส่มอเตอร์สั่นขนาดเล็กที่ทำให้เมาส์สั่นเล็กน้อย นี่เป็นการจำลองความผิดปกติที่เกิดขึ้นจริงมากขึ้น: มันไม่ใช่แค่เคอร์เซอร์ที่สั่น แต่รวมถึงมือและเมาส์ทั้งหมด และยังหมายความว่าคุณสามารถแสดงซอฟต์แวร์อื่นนอกเหนือจากเว็บไซต์

แทนที่จะใช้เมาส์ที่มีช่องน้ำหนักคุณสามารถเพียงแค่นำเทปบางอย่างมาวางบนเมาส์ แต่ก็เห็นได้ชัดเจนกว่า


ในขณะที่ฉันเป็นคนที่ชอบคอมพิวเตอร์และไม่ใช่คนที่มีกลไกฉันจะยึดติดกับโซลูชันอิเล็กทรอนิกส์ ขอบคุณ!
Joshua Muheim

แม้ว่าวิธีแก้ปัญหาฮาร์ดแวร์ที่เป็นไปได้คือการสร้างเมาส์ (มีสาย) เมาส์โดยการเพิ่มเครื่องกำเนิดเสียงแบบสุ่มลงไป
เลียร้อน

6

ในขณะที่คุณกำลังคิดจะทำกับไดรเวอร์เมาส์ที่กำหนดเองฉันคิดว่าโปรแกรมขนาดเล็กที่ทำงานบนพีซีจะทำเช่นกัน หากเป็นกรณีนี้นี่เป็นข้อมูลโค้ดขนาดเล็กสำหรับ C # ซึ่งจะเลื่อนเคอร์เซอร์แบบสุ่มโดยมีช่วงบวกลบ 5px รอบตำแหน่งเคอร์เซอร์ปัจจุบัน หลังจากการกำจัดแต่ละครั้งโปรแกรมจะรอ 50 ms ถึง 100 ms (ไม่ถูกต้อง!) shakiness สามารถกำหนดค่าโดยการปรับค่าสำหรับการกระจัดและการหยุดชั่วคราว ฉันรันสิ่งนี้ในแอปพลิเคชั่นคอนโซลและ - ขึ้นอยู่กับค่า - มันทำให้ฉันค่อนข้างลำบากในการหยุดโปรแกรม

Random rand = new Random();

while(true)
{
    Cursor.Position = new Point() { X = Cursor.Position.X + rand.Next(11)-5, Y = Cursor.Position.Y + rand.Next(11)-5 };
    Thread.Sleep(rand.Next(50) + 50);
}

6

นี่เป็นรุ่นที่หน้าต่างของสคริปต์ xdotool ของฉันที่ใช้AutoIt นี่เป็นสคริปต์ AutoIt ครั้งแรกของฉันและใช้เวลาเพียงไม่กี่นาทีในการเขียนดังนั้นฉันจึงมั่นใจว่าสามารถปรับปรุงได้ เพียงบันทึกด้วยนามสกุล. au3 และเรียกใช้ด้วย AutoIt (เรียกใช้สคริปต์ x86)

HotKeySet("{HOME}", "GStart")
HotKeySet("{PAUSE}", "Gpause")
HotKeySet("{ESC}", "Gexit")

While 1
    Sleep(100)
WEnd

Func Gstart()
While 1
    sleep(100)
    $pos = MouseGetPos()
    $x = $pos[0] + 10 - Random(0, 20, 1)
    $y = $pos[1] + 10 - Random(0, 20, 1)
    MouseMove($x,$y)
Wend
Endfunc


Func Gpause()
While 1
   sleep(100)
Wend
Endfunc

Func Gexit()
    MsgBox(0, "exit box", "Script exited")
    Exit 0
EndFunc

การควบคุม

  • หน้าแรก: เริ่มการจำลอง
  • หยุดชั่วคราว: หยุดการจำลองชั่วคราว
  • Esc: ออกจากการจำลอง

หรือใช้รุ่นที่รวบรวมของฉันจากที่นี่


ดีมาก. ขอบคุณ!
Joshua Muheim

5

คุณไม่สามารถคาดหวังได้ว่าใคร ๆ ก็สามารถจับมือกันได้อย่างสมบูรณ์แบบดังนั้นสิ่งหนึ่งที่คุณสามารถพิจารณาได้คือ

  1. อธิบายกับผู้ใช้ว่าคุณกำลังทำอะไรและ
  2. ทำให้องค์ประกอบที่คลิกได้ในหน้าตัวอย่างเล็กกว่าปกติมาก
  3. การเพิ่มความไวของเมาส์บนระบบตัวอย่างให้สูงสุด

เหตุผลของฉันคือ (ข้อแม้ฉันไม่ใช่ผู้เชี่ยวชาญในด้าน ux หรือยา) โดยทำให้องค์ประกอบคลิกได้น้อยลงคุณสร้างปัญหาที่คล้ายกันสำหรับคนส่วนใหญ่ที่คนที่เป็นโรคพาร์คินสันต้องเผชิญกับเว็บไซต์ทุกวัน


นี่เป็นความคิดที่น่าสนใจเช่นกัน ฉันกำลังวางแผนที่จะทำให้องค์ประกอบที่สามารถคลิกได้มีขนาดค่อนข้างเล็กอยู่ดี
Joshua Muheim

2
ฉันกลัวว่าผู้ใช้เมาส์ส่วนใหญ่สามารถควบคุมอุปกรณ์ได้ถึง 1-2 พิกเซลหากพวกเขามีสมาธิ - เช่นการจับมือนั้นต่ำกว่า 1 พิกเซลด้วยการตั้งค่าเมาส์ที่ฉันใช้ ดังนั้นอาจไม่ใช่วิธีการแก้ปัญหาสากลหากปุ่มของคุณมีขนาดใหญ่กว่า 1-2 พิกเซล ...
Jonas Heidelberg

ฉันจะเพิ่ม # 3, กระแทกความเร็วของเมาส์และคลิกการตั้งค่าให้สูงสุด
Ryan B

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

4

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


ขอบคุณ. แม้ว่าสิ่งนี้จะน่าสนใจมาก แต่เราอาจไม่มีเงินและเวลาที่จะนำผู้มาเยี่ยมทุกคนในชุดสูท ;)
Joshua Muheim

5
สิ่งนี้จะไม่เหมาะกับความคิดเห็นหรือไม่
Selali Adobor

ดีฉันสับสนเล็กน้อยเกี่ยวกับแท็ก javascript และ html แต่เนื่องจากผู้ถามยังแนะนำให้ใช้ไดรเวอร์เมาส์พิเศษ (และแท็บเล็ตที่กล่าวถึงแล้ว) ดูเหมือนว่าจะยินดีต้อนรับโซลูชันอื่น ๆ เมื่อคุณกำจัดข้อ จำกัด เทคโนโลยีเฉพาะนี่คือคำตอบ นี่คือวิธีที่นักวิจัยในสาขานี้กำลังแก้ปัญหาของการจำลองความพิการที่เกี่ยวข้องกับอายุ ฉันยังคิดว่าคุณสามารถ DIY ค่อนข้างถูกถ้าคุณต้องการแรงสั่นสะเทือน - หนึ่งในน้ำหนักข้อมือเวลโครและมอเตอร์สั่นไม่ควรหนักเกินไป
3067860

4
  • ในDIVCSS ของคุณซ่อนเคอร์เซอร์โดยใช้cursor:none;
  • สร้างอิมเมจ. png Cursor และย้าย ( left, top) โดยเปิด jQmousemove
  • สุ่ม. png margin-leftและmargin-topใช้ a setTimeout (เพื่อทำให้การวางตำแหน่งใหม่ราบรื่นใช้ CSS3 transitionหรือทำด้วย jQ .animate())

หมายเหตุ: สคริปต์ไม่สามารถรู้ได้ว่ามือยังอยู่บนเมาส์หรือไม่;)

function rand(min, max) {return Math.random() * (max - min) + min;}

var $cursor = $('div img');

$('div').mousemove(function(e) {  // Make .png follow the mouse coordinates
  $cursor.css({
    left: e.pageX,
    top:e.pageY
  });
}).hover(function(e){
  $cursor.toggle(); // Show .png cursor as we enter the DIV
});

(function tremor(){ // Add tremor to .png image
  $cursor.css({
      marginLeft: rand(-15,15), // arm tremor
      marginTop:  rand(-30,30)  // hand contractions
  });
  setTimeout(tremor, rand(50,100));
}());
div{
  position:absolute;
  background:#eee;
  height:100%;
  width:100%;
  cursor:none;
}

div img{
  display:none;
  position:absolute;
  transition: margin 0.2s;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div><img src="http://i.stack.imgur.com/KwMGA.png"></div>


2

ตอนนี้ชิ้นส่วนระดับต่ำของการจำลองการสั่นสะเทือนได้รับการตอบรับเป็นอย่างดี ฉันจะเพิ่มสิ่งที่มุ่งเน้นไปที่ชนิดของการสั่นสะเทือนเพื่อจำลอง:

คำตอบส่วนใหญ่จะใช้เคอร์เซอร์ของเมาส์ที่เคลื่อนที่บนเส้นทางสุ่มโดยมีความกว้างขั้นสูงสุดคงที่ในทิศทาง X และ Y

สิ่งนี้ควรทำงานได้ดีพอสำหรับกรณีการใช้งานทำให้ยากต่อการตีในพื้นที่เฉพาะเช่นปุ่ม

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

อาจเป็นเรื่องยากที่จะได้รับข้อมูลการติดตามการเคลื่อนไหวของมือสั่นแน่นอน แต่มีเอกสารเกี่ยวกับการวิเคราะห์การสั่นแบบนี้:

การเป็นตัวแทน Parametricกระดาษของการเคลื่อนไหวของมือในโรคพาร์กินสันเป็นเรื่องเกี่ยวกับวิธีการพล็อตการเคลื่อนไหวมือ 3 มิติที่ดีที่สุด
กระดาษ paywalled แต่ภาพตัวอย่างด้านบนขวาป้าย "ดูภายใน>" ในภาพหนังสือเล่มนี้แสดงให้เห็นว่าการลงจุดที่น่าสนใจบางส่วนที่แตกต่างกันเป็นตัวแทนของข้อมูลมือร่องรอย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.