กำหนดความยาวส่วนโค้งของเส้นโค้ง Catmull-Rom เพื่อเคลื่อนที่ด้วยความเร็วคงที่


18

ฉันมีเส้นทางที่กำหนดโดยการต่อข้อมูลของ Catmull-Rom splines ฉันใช้วิธีการคงที่ Vector2.CatmullRom ใน XNA ที่ช่วยให้การแก้ไขระหว่างจุดที่มีค่าไปจาก 0 ถึง 1

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

ฉันใช้สิ่งนี้สำหรับการทำแผนที่พื้นผิวแบบไดนามิกในตาข่ายที่สร้างขึ้นที่กำหนดโดยเส้นโค้ง

คำตอบ:


25

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

ทางออกที่ดีกว่าคือการเปลี่ยนพารามิเตอร์พารามิเตอร์ของเรา(พารามิเตอร์ที่เปลี่ยนจาก 0 เป็น 1 ซึ่งฉันจะเรียกsเพื่อหลีกเลี่ยงความสับสนด้วยt = time)ที่อัตราตัวแปรds/dtซึ่งกำหนดโดยความเร็วที่คุณต้องการให้วัตถุเคลื่อนที่ จุดนั้นบนเส้นโค้ง ดังนั้นอาจกล่าวได้ว่าแทนการเปลี่ยนแปลงs0.01 เฟรมต่อเฟรมเราอาจเปลี่ยน 0.005 หนึ่งเฟรม 0.02 เฟรมต่อไปเป็นต้น

เราทำสิ่งนี้โดยการคำนวณอนุพันธ์ของx( dx/ds) และy( dy/ds) แต่ละเฟรมจากนั้นตั้งค่า

ds / dt = speed / sqrt ((dx / ds) 2 + (dy / ds) 2 )

นั่นคือโดยการใช้ความเร็วที่เราต้องการไปและหารด้วยความเร็วที่เราต้องการจริง ๆ ถ้าเรามีการเปลี่ยนแปลงsที่เพิ่มขึ้นคงที่


พิสูจน์

เราต้องการความเร็วของวัตถุของเราให้คงที่ speedขอให้คงที่ว่าชื่อ

เราได้เรียนรู้ในแคลคูลัสสองปีว่าสำหรับสมการตัวแปรx(s)และy(s),

ความเร็ว = sqrt ((dx / dt) 2 + (dy / dt) 2 )

เรายังได้เรียนรู้ว่า

dx / dt = dx / ds * ds / dt     (กฎลูกโซ่)

ดังนั้น,

ความเร็ว = sqrt ((dx / ds) 2 (ds / dt) 2 + (dy / ds) 2 (ds / dt) 2 )

แก้เพื่อds/dtเราจะได้สมการที่ระบุ


การคำนวณอนุพันธ์

ผมไม่เคยทำงานร่วมกับเส้นโค้งโดยเฉพาะอย่างยิ่ง แต่ผมเข้าใจว่าพวกเขาเพียงแค่ให้x(s)และในแง่ของลูกบาศก์สมการy(s) sดังนั้นเราสามารถหาอนุพันธ์dx/dsได้ง่าย: ถ้า

x (s) = a * s 3 + b * s 2 + c * s + e

แล้วก็

dx / ds = 3a * s 2 + 2b * s + c

(เดียวกันdy/ds)และแน่นอนว่าคุณจะต้องรู้ค่าที่แน่นอนของa, bและcการทำเช่นนี้ ตามนี้หน้านี้ค่าเหล่านั้นหาง่าย


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

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

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