จะจำลองความดันด้วยอนุภาคได้อย่างไร


11

ฉันพยายามจำลองแรงกดดันด้วยชุดอนุภาคทรงกลมในเกม Unity ที่ฉันกำลังสร้าง คู่บันทึกเกี่ยวกับปัญหา:

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

ฉันสงสัยว่าวิธีการบางอย่างที่ฉันสามารถใช้เพื่อจัดการกับปัญหาเหล่านี้คือ ...

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

วิธีการในปัจจุบันที่ฉันใคร่ครวญคือการใช้กำแพงที่มีการเคลื่อนไหวอยู่ตลอดเวลานั่นคือปิดหน้าจอและเคลื่อนที่ไปพร้อมกับหน้าจอดังที่ภาพนี้แสดงให้เห็น:

ความดัน!.

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

ขอบคุณมากสำหรับภูมิปัญญาของคุณ!

คำตอบ:


6

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

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

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

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

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

ดังนั้นคุณอาจต้องการที่จะแนะนำปัจจัยในการคำนวณแรงผลักดันให้เริ่มต้นด้วย 1.0 และเมื่อคุณเพิ่มอนุภาค x ให้สร้างปัจจัยใหม่n / (n + x)โดยที่ n คือจำนวนอนุภาคทั้งหมดก่อนที่จะเพิ่มอนุภาคใหม่


2

ความดัน (เช่นเดียวกับแก๊ส) เป็นผลมาจากการชนแบบยืดหยุ่นระหว่างอนุภาคของคุณกับระหว่างอนุภาคและผนัง คุณเพียงแค่วัดจำนวนการชนกันต่อเวลากับกำแพงเพื่อรับค่าความดันของคุณ

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

หากคุณเพิ่มอนุภาคในระบบปิดนี้ความดันจะเพิ่มขึ้นเนื่องจากมีพลังงานมากขึ้นในระบบทั้งหมด (คุณเพิ่งเพิ่มอนุภาคใหม่ด้วยอุณหภูมิที่กำหนด <-> ความเร็ว)


อนุภาคควรมีมวลสำหรับการชนแบบยืดหยุ่นเนื่องจากผนังถูกสันนิษฐานว่ามีมวลใกล้ + อนันต์
Aron_dc

ฉันบอกว่า "ความดันคือจำนวนการชนต่อเวลากับกำแพง" ที่แม่นยำ 100% ในการชนแบบยืดหยุ่นคุณจะต้องใช้แรงกระตุ้นของอนุภาคนั้นและวัดว่ามีแรงกระตุ้นที่มอบให้กับผนังเท่าใด ดังนั้นหากอนุภาคหนึ่งชนกันในแนวตั้งกับผนังกำแพงจะได้แรงกระตุ้น 2mv (m = มวลของอนุภาค; v = ความเร็วของอนุภาค) ดังนั้นคุณจึงวัดแรงกระตุ้นที่เข้ามาบนผนัง อนุภาคจะถูกสะท้อน (v ก่อนการชน = -v หลังจากการชน) สิ่งนี้ยังช่วยในการวัดความดันของก๊าซผสมที่แตกต่างกัน
Aron_dc

0

แต่ละวงคุณควรวนซ้ำอนุภาคทั้งหมดของคุณแล้วคำนวณแรงสุดท้ายของอนุภาคนั้น โดยพื้นฐานแล้วผนังจะให้เวกเตอร์แรงบวกกับแกน x เสมอหากพวกมันชนกับมัน (particle.x - particle.r <= 0)

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

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

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

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

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