เป็นไปได้ที่จะประมาณวิธีแก้ปัญหานี้สำหรับวิถีกระสุนส่วนใหญ่ แนวคิดนี้มีดังต่อไปนี้: หากคุณซูมเข้าไปในโค้งที่ลึกพอคุณจะไม่สามารถบอกได้ว่าเส้นโค้งนั้นเกิดจากการสัมผัสกัน ณ จุดนั้น
ด้วยการทำสมมุติฐานนี้ไม่จำเป็นต้องคำนวณอะไรล่วงหน้ามากกว่าสองเวกเตอร์ (สามเส้นโค้งสำหรับเบซิเยร์ลูกบาศก์ฯลฯ )
ดังนั้นสำหรับเส้นโค้งM(t)เราคำนวณเวกเตอร์แทนเจนต์ของมันdMdtที่จุดt∥dMdT∥Δt∥dMdT∥ΔtLL÷∥dMdT∥
แอพลิเคชัน: Bezier โค้งกำลังสอง
หากจุดควบคุมของเส้นโค้ง Bezier คือ ,และวิถีการเคลื่อนที่สามารถแสดงเป็น:ABC
M(t)=(1−t)2A+2t(1−t)B+t2C=t2(A−2B+C)+t(−2A+2B)+A
ดังนั้นอนุพันธ์คือ:
dMdt=t(2A−4B+2C)+(−2A+2B)
คุณแค่ต้องเก็บเวกเตอร์ v⃗ 1=2A−4B+2C → v 2=-2A+2BtLและที่ไหนสักแห่ง จากนั้นสำหรับกำหนดถ้าคุณต้องการเลื่อนความยาวคุณต้องทำ:v⃗ 2=−2A+2BtL
t=t+Llength(t⋅v⃗ 1+v⃗ 2)
Cubic Bezier curves
การใช้เหตุผลแบบเดียวกันนั้นใช้กับเส้นโค้งที่มีจุดควบคุมสี่จุดA , ,และ :BCD
M(t)=(1−t)3A+3t(1−t)2B+3t2(1−t)C+t3D=t3(−A+3B−3C+D)+t2(3A−6B+3C)+t(−3A+3B)+A
อนุพันธ์คือ:
dMdt=t2(−3A+9B−9C+3D)+t(6A−12B+6C)+(−3A+3B)
เราคำนวณค่าเวกเตอร์สามตัวล่วงหน้า:
v⃗ 1v⃗ 2v⃗ 3=−3A+9B−9C+3D=6A−12B+6C=−3A+3B
และสูตรสุดท้ายคือ:
t=t+Llength(t2⋅v⃗ 1+t⋅v⃗ 2+v⃗ 3)
ปัญหาความแม่นยำ
หากคุณทำงานที่อัตราเฟรมที่สมเหตุสมผล L (ซึ่งควรคำนวณตามระยะเวลาของเฟรม) จะมีขนาดเล็กพอสำหรับการประมาณการทำงาน
อย่างไรก็ตามคุณอาจพบความไม่ถูกต้องในบางกรณี ถ้าใหญ่เกินไปคุณสามารถทำการคำนวณทีละตัวอย่างเช่นใช้ 10 ส่วน:L
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);