1 คะแนน โดย GN⁺ 2024-09-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • การทำภาพประกอบดนตรีสไตล์ Pong ปรับฟิสิกส์ของเกมและมองตำแหน่งแพดเดิลเป็นตัวแปรสำหรับการปรับให้เหมาะสม เพื่อให้จังหวะที่ลูกบอลชนแพดเดิลตรงกับ บีต ของเพลง
  • ลูกบอลเคลื่อนที่ด้วย ความเร็วคงที่ และแพดเดิลแต่ละอันสามารถย้ายไปที่ใดก็ได้ในครึ่งหน้าจอของตัวเอง โดยจุดสัมผัสจะกำหนดมุมสะท้อน และลูกบอลจะเด้งกับผนังด้านบนและด้านล่าง
  • หากวางแพดเดิลไว้ใกล้กึ่งกลาง จะจับเวลาให้ตรงได้ทุกแบบ แต่ใช้พื้นที่หน้าจอน้อยและการเคลื่อนไหวดูจืด ทำให้ยากที่จะเป็น การแสดงภาพ ที่ดี
  • กำหนดตำแหน่งแนวนอนของแพดเดิลและความเร็วแนวนอนของลูกบอลในแต่ละจังหวะบีต แล้วจัดรูปเป็นปัญหาการโปรแกรมเชิงเส้นที่เพิ่มจำนวน การตีแพดเดิลที่ไกลจากกึ่งกลาง ให้มากที่สุด ขณะยังรักษาข้อจำกัดทางฟิสิกส์และจังหวะเพลง
  • การใช้งานจริงใช้ CVXPY แก้ข้อจำกัดเชิงเส้น จากนั้นคำนวณมุมสะท้อนและตำแหน่งแนวตั้งจากตำแหน่งแพดเดิลและความเร็วลูกบอลที่ได้ แล้วสร้างแอนิเมชันด้วยการอินเตอร์โพเลตคีย์เฟรม

การตั้งค่าฟิสิกส์เพื่อให้ Pong ตรงกับบีตเพลง

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

ข้อจำกัดของวิธีวางไว้ตรงกลาง

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

เปลี่ยนเป็นการปรับให้เหมาะสมภายใต้ข้อจำกัด

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

ค่าอินพุตและข้อจำกัดเชิงเส้น

  • อินพุตคงที่คือความกว้างหน้าจอและความเร็วลูกบอล
    • W: ความกว้างหน้าจอ
    • S: ความเร็วของลูกบอล
  • เวลาของบีตได้มาจากไฟล์ MIDI
    • T = {t_0, t_1, ..., t_n} คือเวลาบีตแต่ละจุดที่ลูกบอลต้องชนแพดเดิล
    • ในอนาคตยังสามารถสำรวจวิธีสกัดจากเสียงโดยอัตโนมัติมากขึ้นได้
  • ใช้ผลต่างระหว่างเวลาบีตที่ติดกันเพื่อสร้างระยะเวลาของแต่ละช็อต
    • D = {d_0, d_1, ..., d_{n-1}}
    • d_i = t_{i+1} - t_i
  • ตัวแปรสำหรับการปรับให้เหมาะสมคือ ตำแหน่งแนวนอนและความเร็วแนวนอน
    • P = {p_0, p_1, ..., p_{n-1}} คือ ระยะทางแนวนอน จากกึ่งกลางหน้าจอในขณะที่แพดเดิลตีลูก
    • ดัชนีเลขคู่แทนแพดเดิลซ้าย ดัชนีเลขคี่แทนแพดเดิลขวา
    • V = {v_0, v_1, ..., v_{n-1}} คือความเร็วแนวนอนของลูกบอลหลังการตีแต่ละครั้ง
    • เพื่อให้สร้างข้อจำกัดได้ง่าย v_i จึงนิยามให้เป็นค่าบวกเสมอ โดยไม่ขึ้นกับทิศทางที่ลูกบอลเคลื่อนไปซ้ายหรือขวา
  • ข้อจำกัดทางฟิสิกส์กำหนดช่วงของตำแหน่งแพดเดิลและความเร็วลูกบอล
    • 0 ≤ p_i ≤ W/2
    • 0 < v_i ≤ S
  • ข้อจำกัดการซิงก์บีตทำให้ลูกบอลไปถึงแพดเดิลถัดไปตรงเวลา
    • p_{i-1} + p_i = d_i v_i
    • ฝั่งซ้ายคือระยะทางแนวนอนรวมระหว่างการตีแพดเดิลสองครั้งต่อเนื่องกัน
    • ฝั่งขวาคือผลคูณของระยะเวลาช็อตกับความเร็วแนวนอนของลูกบอล

ฟังก์ชันวัตถุประสงค์และการสร้างแอนิเมชัน

  • เพื่อหลีกเลี่ยงคำตอบเสื่อมที่ค้างอยู่กลางจอ จึงชี้นำให้แพดเดิลอยู่ห่างจากกึ่งกลางหน้าจอ
  • ฟังก์ชันวัตถุประสงค์คือเพิ่มผลรวมระยะห่างจากกึ่งกลางของแพดเดิลให้มากที่สุด
    • Maximize Σ p_i
  • เนื่องจากข้อจำกัดทั้งหมดเป็นเชิงเส้น จึงแก้ได้ด้วยตัวแก้ การโปรแกรมเชิงเส้น (LP)
  • การใช้งานจริงใช้ CVXPY
    • CVXPY ใช้แก้ปัญหาการปรับให้เหมาะสมแบบนูน และ LP เป็นส่วนย่อยของสิ่งนั้น
    • งานนี้ไม่ต้องใช้ความสามารถทั้งหมด แต่การรองรับฟังก์ชันวัตถุประสงค์และข้อจำกัดที่ซับซ้อนกว่านั้นเอื้อต่อการทดลองเชิงสร้างสรรค์
  • ตัวแก้ปัญหาจะคืนตำแหน่งแนวนอนที่แพดเดิลควรตีลูก และความเร็วแนวนอนของลูกบอล
    • สามารถใช้ค่านี้คำนวณมุมสะท้อนได้
    • ตำแหน่งแนวตั้งคำนวณด้วยการจำลอง
  • แอนิเมชันสุดท้ายใช้ตำแหน่งของลูกบอลและแพดเดิล ณ เวลาที่ตีเป็น คีย์เฟรม
    • ระหว่างการตีแต่ละครั้ง จะอินเตอร์โพเลตตำแหน่งเพื่อสร้างการเคลื่อนไหวที่ลื่นไหล
  • โค้ดเปิดเป็นโอเพนซอร์ส: Github Repo

1 ความคิดเห็น

 
GN⁺ 2024-09-04
ความคิดเห็นจาก Hacker News
  • นึกถึงโปรเจกต์เมื่อราว 20 ปีก่อน ที่ผมเคยเขียนโค้ด เสียงสำหรับผู้เล่นหลายคนพร้อมกัน เพื่อจัดแสดงงานศิลปะ
    ยิ่งเกมดุเดือดขึ้น ก็ยิ่งเห็นชัดว่าเสียงลูกบอล/กำแพงกำลังเล่นดนตรีอยู่ และผู้เล่นสามคนจริง ๆ แล้วกำลังร่วมกันเล่นเพลงเดียว
    เราจัดตู้อาร์เคด 3 ตู้ให้หันเข้าหากัน เพื่อให้ผู้เล่นแต่ละคนมองไม่เห็นหน้าจอของคนอื่น แล้วปรับความเร็ว/ทิศทางของลูกบอลเล็กน้อยให้ไปโดนไม้ตีหรือกำแพงในจังหวะที่ถูกต้องทางดนตรี เพื่อให้เกิดเสียงที่ถูกต้อง
    Josh ยังเคยเอาไปลงไว้เป็นข้อมูลอ้างอิงบนไซต์ของเขาด้วย: https://www.autogena.org/work/ping

    • เจ๋งดี งั้นก็มี บทประพันธ์ที่ตายตัว อยู่ แล้วปรับเกมเพลย์เล็กน้อยให้เข้ากับมันใช่ไหม?
  • ไอเดียอีกแบบหนึ่งที่นึกภาพได้คือ ฝึก เอเจนต์ reinforcement learning กับเกม Atari หรือ Super Mario แต่เพิ่มรางวัล/อินพุตที่อิงดนตรีเข้าไป เพื่อให้เกิดการเล่นที่ดู “เป็นดนตรี”
    ไม่แน่ใจว่ามันจะดูดีแค่ไหน หรือคุ้มค่าหรือเปล่า

    • ผมเป็นมือใหม่ด้าน machine learning แต่ OpenAI เคยทำไลบรารี Python สำหรับ reinforcement learning ในวิดีโอเกม และ fork ของมันยังได้รับการดูแลอย่างคึกคักอยู่ [1]
      เท่าที่จำได้เมื่อไม่กี่ปีก่อน ใช้เวลาสักวันหรือสองวัน อย่างมากก็ช่วงสุดสัปดาห์ ก็น่าจะรันได้แล้ว มันใช้ emulator ของ RetroArch และรองรับ emulator กับคอนโซลจำนวนมาก
      https://github.com/Farama-Foundation/Gymnasium
      ยังมีวิดีโอ YouTube ยอดเยี่ยมของ SethBling ที่พูดถึง machine learning กับ Super Mario World ด้วย:
      https://www.youtube.com/watch?v=qv6UVOQ0F44
      แนะนำให้ลองทำเอง ในกระแส AI ที่ร้อนแรงตอนนี้ วิดีโอเกมดูเหมือนจะถูกประเมินค่าต่ำไปสักหน่อย และผมคิดว่ามีศักยภาพมากในการให้เครื่องเล่นเกมเพื่อเรียนรู้ทักษะต่าง ๆ ความเป็นไปได้ในการเลือกเกมหรือสร้างเกมใหม่เพื่อสอนทักษะเฉพาะก็มีมากเช่นกัน แต่พอถึงจุดนั้น การทิ้งเสียงกับภาพ แล้วสื่อสารกับเครื่องด้วยข้อความหรือข้อมูลล้วน ๆ อาจจะดีกว่าก็ได้
      อีกด้านหนึ่ง ผมเคยเห็นวิดีโอเกี่ยวกับ convolutional neural network ที่ป้อนพิกเซลแต่ละพิกเซลของภาพเป็นอินพุต เลยคิดว่าการฝึกด้วยข้อมูลเสียงหรือพิกเซลของ spectrogram ก็น่าจะให้ผลดีได้เช่นกัน ฉากที่เล่นเกมให้เข้ากับดนตรี หรือเล่นเหมือนเต้นไปตามทำนอง เมโลดี ฮาร์โมนี และเรื่องราว น่าจะสนุกแน่นอน
      ทุกสิ่งที่มนุษย์สร้างขึ้นล้วนเคยอยู่ในจินตนาการของมนุษย์ก่อน และคุณก็มีสมองแบบนั้นเช่นกัน การไล่ตามภาพในใจแล้วดึงมันออกมาสู่ความจริงทางกายภาพเป็นเรื่องงดงาม และดูเหมือนเป็นของขวัญให้มนุษยชาติทั้งมวล
    • Crypt of the NecroDancer สำรวจไอเดียนี้ด้วยการให้โบนัสในเกมเมื่อขยับตัวละครให้ตรงจังหวะ
    • ไม่น่าจะดีนัก Mario ไม่มี จังหวะ มากพอที่จะทำให้นึกถึงความเป็นดนตรีได้ชัดเจน
      เสียงของต้นฉบับผูกกับ frame rate ดังนั้นโดยพื้นฐานแล้วเรื่องแบบนี้เกิดขึ้นอยู่บ้างอยู่แล้ว ภายหลังพอร์ตเวอร์ชัน PAL รันด้วย frame rate ที่ช้ากว่า ทำให้คุณสมบัตินี้พังไป
  • นึกถึง การแสดงภาพ polyrhythm บน YouTube ตัวอย่างที่ดีให้ดู LucidRhythms
    https://www.youtube.com/@LucidRhythms
    การเอาเพลงที่เขียนไว้แล้วมาย้อนให้เข้ากับภาพเคลื่อนไหวน่าจะแทบเป็นไปไม่ได้ แต่ถ้าให้แท่งต่าง ๆ แทนโน้ตคนละเสียง และให้ลูกบอลแตกออกเมื่อเป็นคอร์ด ก็น่าจะน่าสนุก

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

  • งานก่อนหน้า: Eisenfunk - Pong (https://www.youtube.com/watch?v=cNAdtkSjSps)

    • แต่ก็แตกต่างกันค่อนข้างมาก ตัวอย่างนั้นเสียงบี๊บดังด้วยความเร็วคงที่ จึงเป็นการซิงก์วิดีโอให้เข้ากับ BPM ของเพลงด้วยมือ
      โดยพื้นฐานแล้วมันใกล้เคียงกับ visualization ที่ทำด้วยมือสำหรับ kick drum ทุก ๆ สองลูก
      ในขณะที่งานที่ส่งมานี้ โน้ตไม่ได้อยู่ที่จังหวะ quarter note แบบง่าย ๆ และถูก “ทำแอนิเมชัน” อัตโนมัติบนพื้นฐานของ constraint optimization ดังนั้น visualization จึงน่าสนใจกว่ามาก
  • ชอบมากจริง ๆ แต่ถ้าไม่ได้สมัครสมาชิกก็ส่งหัวใจให้ไม่ได้ เลยรู้สึกว่าไม่ค่อยเหมาะกับผมเท่าไร

  • ในเชิงเทคนิคถือว่าโอเค แต่มีหลายครั้งที่แพดเดิลกับลูกบอลเคลื่อนที่ด้วยความเร็วเกือบเท่ากัน จนดูเหมือนแพดเดิลกำลังดันลูกบอลอยู่เรื่อย ๆ
    ด้วยเหตุนี้ น่าจะไม่อนุญาต p[i] = 0 จะดีกว่า ถ้า d[i] ที่ใหญ่มากตามด้วย d[i+1] ที่เล็กมากก็อาจเลี่ยงไม่ได้ แต่ในกรณีที่เลี่ยงได้ก็น่าจะทำให้เลี่ยง

    • สามารถใส่ ค่าปรับ ที่แปรผันตาม d'[i] ใน objective function ได้
  • ทำให้จินตนาการถึงการมี installation ในพื้นที่ของผม แล้วใช้ MT-80S ร่วมกับจอแสดงผล
    ผมจะเข้าใจ timing นี้ได้ถูกต้องไหมนะ? ผมไม่ได้เก่งทางนี้เท่าไร แต่สนใจอยู่
    https://www.matrixsynth.com/2014/07/roland-mt-80s-midi-playe...

  • น่าสนใจมากจริง ๆ แต่แปลกที่สมองผมเกลียดสิ่งนี้อย่างแรง
    เหมือนมันไปสะกิดอะไรบางอย่างอย่าง โมเดลเหตุและผล ในตัวผม และทำให้ดูยาก รู้สึกประหลาดดี

    • สิ่งที่ผมรู้สึกว่าขาดไปชัดที่สุดคือ ไดนามิกความดังเบา โดยเฉพาะในช่วง passage เร็ว ๆ ที่มี “ghost note” อยู่ระหว่างโน้ตที่ดังมากกว่า มันรู้สึกเหมือนมีบางอย่างหายไป
      แต่ถึงอย่างนั้นก็แปลกที่การดูมันยังให้ความพึงพอใจอยู่ ผมสงสัยว่าประสบการณ์ที่เคยเล่นเครื่องดนตรีหลายชนิดมีส่วนเกี่ยวข้องกับความรู้สึกนี้หรือไม่ สำหรับผม เครื่องอย่างไซโลโฟนหรือ steelpan ให้ความรู้สึกค่อนข้างคล้ายกับสิ่งนี้
    • ลูกบอลดูเหมือนเด้งจาก ตรงกลาง ของแพดเดิล ไม่ใช่จากขอบ เลยดูขัดตาอยู่ตลอด บางทีเราอาจกำลังเห็นปัญหาเดียวกันอยู่ก็ได้
  • Atari เคยมี อุปกรณ์ visualizer ดนตรีวิดีโอ ในช่วงปลายทศวรรษ 1970 ออกแบบโดยหนึ่งในผู้พัฒนาเกม Pong และน่าจะเป็นผลิตภัณฑ์สำหรับผู้บริโภคประเภทนี้รุ่นแรก ๆ หรืออย่างน้อยก็หนึ่งในรุ่นแรก ๆ
    https://en.wikipedia.org/wiki/Atari_Video_Music
    ถ้าเคยดูหนัง Over the Edge จะเห็นว่า Claude กับ Johnny มีเครื่องหนึ่งอยู่ที่บ้าน