มันเป็นความคิดที่ยอดเยี่ยม คุณต้องการการไล่ระดับสีแบบกระจายรอบเรือของคุณ มีสามแบบจำลองทางกายภาพที่ฉันสามารถนึกได้ว่าคุณอาจต้องการ:
คุณต้องการให้มันดูเหมือนว่าเป็นสื่อกลางของเหลวที่ซึ่งการไล่ระดับสีของความกดดันเกิดขึ้นเช่นเมื่อคุณผ่านอนุภาคบางอย่างที่พวกมันเคลื่อนที่กลับเข้าสู่การปลุกของคุณ (เช่นน้ำหลังเรือ) ในตัวอย่างนี้ตำแหน่งของอนุภาคนั้นสมบูรณ์และเป็นเพียงความสัมพันธ์ของพวกเขากับผู้เล่นซึ่งปรับเปลี่ยนตำแหน่งการแสดงผลชั่วคราว นี่เป็นเหมือนเมื่อคุณผ่านแว่นขยายหนาเหนือสิ่งต่าง ๆ และการเลี้ยวเบนดูเหมือนจะทำให้มันเคลื่อนที่ - แต่จนกว่าคุณจะขยับกระจกออกไป ในกรณีนี้เรือของคุณเป็นแก้ว
หากคุณต้องการให้พวกเขาย้ายออกจากเรือและดำเนินการต่อเมื่อพวกเขาย้าย นี่เป็นเหมือนฟิสิกส์มาตรฐานในพื้นที่ว่างเปล่าโดยทั่วไปซึ่งไม่มีการไล่ระดับความดัน (หรือเล็กมาก)
คุณต้องการย้ายอนุภาคออกไปจากเรืออย่างรวดเร็วในขณะที่เข้าใกล้เช่นใน (1) และ (2) แต่เมื่อเรือหายไปอนุภาคจะค่อยๆปรับสมดุลตัวเองอย่างช้าๆ
ร่วมกันแก้ปัญหาทั้งสาม : คุณต้องมีฟิลด์การแพร่ที่เคลื่อนที่ด้วยเรือของคุณ ในตัวอย่างนี้เราจะทำให้มันเป็นวงกลม จากนั้นคุณตรวจจับเวกเตอร์, เรียกมันว่า v1, ระหว่างเรือและแต่ละอนุภาคภายในภูมิภาคนั้น ผลักอนุภาคของคุณออกไปตามเวกเตอร์นั้น วิธีการขอคุณจะผลักดันมันออกไปจะขึ้นอยู่กับระยะทางของมันจากเรือ: 1 - v1.magnitude
ใช้งาน สูตรนี้จะให้ความแข็งแรงเชิงเส้นแก่คุณอย่างไรก็ตามคุณสามารถปรับเปลี่ยนให้ใช้อย่างอื่นเช่นเส้นโค้งความแข็งแรงแบบวงกลมที่ลดความแข็งแรงลงทางขอบ นี่จะทำให้มันดูราวกับว่ามันเป็นทรงกลมมากกว่าการไล่ระดับแรงดันแบบวงกลมรอบ ๆ เรือ
สำหรับการแก้ปัญหา 1 : ทั้งหมดตอนนี้คุณทำคือการปรับเปลี่ยนการแสดงผลตำแหน่งของอนุภาคที่ (นั่นคือตำแหน่งเทพดา) ในทุกการแสดงผลการปรับปรุงโดยเวกเตอร์นี้ เนื่องจากคุณทำเช่นนี้นี่เป็นเอฟเฟกต์การแสดงผลอย่างหมดจดและไม่มีผลต่อตำแหน่งโลกที่แท้จริงของอนุภาค ดังนั้นคุณจึงเพิ่มตำแหน่งของโลกไปยังเรนเดอร์เรนเดอร์ (v1) และตอนนี้คุณมีอนุภาคที่ถูกแทนที่อย่างดีเมื่อคุณเคลื่อนที่ไปทางหรือข้างพวกมันและคืนค่าอนุภาคได้อย่างราบรื่นเมื่อคุณผ่าน
สำหรับโซลูชันที่ 2 : แทนที่จะใช้ v1 กับตำแหน่งมุมมองให้ใช้มันในการอัพเดทแบบลอจิกแต่ละครั้งกับตำแหน่งของอนุภาค p1.position += v1
ดังนั้น ดังนั้นคุณกำลังใช้แรงเร่งกับอนุภาคซึ่งแปลเป็นความเร็ว อาจเป็นไปได้ว่าคุณต้องการให้ความเร็วของแต่ละอนุภาคลดลงเพื่อที่พวกเขาจะชะลอความเร็วลงและหยุดชะงักเมื่อคุณผ่านไปแล้ว คุณสามารถดูว่าวิธีการแก้ปัญหานี้จะส่งผลให้เกิดอนุภาคกระจุกตัวในเนบิวลาของคุณเพราะพวกเขาจะไม่เคย rediffuse ไม่เหมือนจริงมากฉันแน่ใจว่าเนื่องจากเนบิวลามีแรงกดดันในการไล่ระดับสีภายในพวกเขาไม่ว่าในความเป็นจริงจะอ่อนแอแค่ไหน
สำหรับวิธีแก้ปัญหา 3: เหมือนกับ (2) แต่ในกรณีนี้คุณจะต้อง rediffuse อนุภาคของคุณ ในการทำเช่นนี้ได้ง่าย ๆ เป็นวิธีการที่ดุร้าย แต่เนื่องจากสิ่งเหล่านี้เป็นเพียงอนุภาคและทำให้ลูกตาคุณอาจไม่จำเป็นต้องครอบคลุมพื้นที่ขนาดใหญ่ที่น่าสนใจ (อาจเป็นเพียงรัศมีของผู้เล่นตำแหน่ง + maxPlayerSpeedPerTick หรืออะไรก็ตาม พื้นที่สี่เหลี่ยมล้อมรอบเพื่อวัตถุประสงค์เชิงตรรกะ) แต่ละอนุภาคจะใช้แรงกับอนุภาคอื่น ๆ ในพื้นที่ที่น่าสนใจ พวกเขาจะใช้กองกำลังตามระยะทางของพวกเขาจากกันอีกครั้ง คำนวณกองกำลัง interparticle ทั้งหมดในการกวาดครั้งเดียวข้ามบริเวณที่สนใจแล้วใช้แรงทั้งหมดในการกวาดครั้งเดียว สุดท้ายตรวจสอบให้แน่ใจว่าคุณทำการประมวลผลแรงระหว่างอนุภาคกับอนุภาคที่ไม่มีความเร็วเท่านั้น และเมื่อใดก็ตามที่มีอนุภาคถึงความเร็วขั้นต่ำ
มีสูตรการแพร่กระจายทุกชนิด ฯลฯ มี แต่ฉันคิดว่าในกรณีนี้วิธีแก้ปัญหาง่าย ๆ ทำงานได้ดีที่สุด