Tính toán tiêu đề xe đạp từ tiêu đề bánh xe phía trước và vận tốc


10

Tôi có một trò chơi xe đạp từ trên xuống đơn giản mà tôi đang cố gắng thêm tay lái. Tôi muốn biết làm thế nào tôi sử dụng tiêu đề của bánh trước để xác định tiêu đề và vận tốc của xe đạp.

void Update () 
{
    //Get input from user Vertical: 0 to 1, Horizontal -1 to 1
    float forwardInput = Input.GetAxis("Vertical");
    float sidewaysInput = Input.GetAxis("Horizontal") * m_steeringAmount;

    // Turn front wheel
    m_frontWheelTransform.localEulerAngles = new Vector3(0, sidewaysInput, 90);

    // get speed and drag
    float   speed           = m_velocity.magnitude;
    Vector3 forwardDrag     = -m_forwardDragConstant * m_velocity * speed;

    // calculate acceleration 
    float engineForce       = forwardInput * m_enginePower;
    Vector3 forwardTraction = transform.forward * engineForce;
    Vector3 forwrdForce     = forwardTraction + forwardDrag;
    Vector3 acceleration    = forwrdForce / m_mass;

    // update velocity and position
    m_velocity += acceleration * Time.deltaTime;
    transform.localPosition += m_velocity * Time.deltaTime;
}

Tôi đã cố gắng áp dụng vận tốc xe đạp cho bánh trước và bánh sau và sử dụng sự khác biệt của các vị trí có để xác định hướng xe đạp, nhưng lực kéo về phía trước làm cho nó khó hiểu.

Chỉnh sửa dựa trên bình luận madshogo

nhập mô tả hình ảnh ở đây


Tôi đang nghe điện thoại của mình vào lúc này vì vậy tôi sẽ chỉ đưa ra một câu trả lời ngắn gọn: các bánh xe tiếp xúc với một vòng tròn hư cấu dọc theo chiếc xe đạp, do đó làm cho chiếc xe đạp quay. Tâm của vòng tròn nằm ở giao điểm của các đường trực giao với mỗi bánh xe. Nếu các bánh xe đều thẳng (xe đạp không quay) thì các đường này đi ngang vô tận (chúng song song) dẫn đến một vòng tròn bán kính vô hạn, tức là một đường. Cuối cùng, điều này cung cấp cho bạn quỹ đạo mà chiếc xe đạp nên đi theo (vòng tròn) hoặc độ cong của nó, tùy theo nhu cầu của bạn.
jrsala

Cảm ơn câu trả lời madshogo. Bạn có thể xem sơ đồ tôi đã thêm và cho tôi biết nếu đó là chính xác. Đường màu đỏ là tiêu đề xe đạp. Chúc mừng
user346443

Đợi đã, bánh trước không tiếp xúc với vòng tròn trong bản vẽ của bạn. Trong đầu tôi, cả hai bánh xe đều tiếp tuyến. Điều đó thay đổi một vài điều.
jrsala

Bạn đã xem trang Wikipedia cho vật lý xe đạp ? Nó có các công thức hữu ích cho bán kính quay vòng có tính đến.
sam hocevar

Câu trả lời:


3

Ok, tôi đã trở lại với kết quả!

xe đạp hoạt hình

Tôi đã thử hai cách tiếp cận:

  • Sử dụng cơ học chất rắn để rút ra phương trình vi phân điều khiển chuyển động của tâm bánh xe: đầu vào của hệ thống "xe đạp" là mô-men xoắn ở bánh sau và góc của bánh trước, và đầu ra là động học của tâm của các bánh xe. Nhưng tôi đã từ bỏ, thật khó!

  • Cố gắng đoán những gì xảy ra từ quan điểm hình học khi bánh sau "đẩy" bánh trước về phía trước với bánh trước không thẳng. Phương pháp này trực tiếp mang lại một phương trình gia số vô hạn (xem bên dưới) từ đó bạn có thể nhận được một phương trình vi phân thực tế. Tôi đã không thử thao tác phương trình đầu tiên này để có được ODE nhưng tôi đoán là tôi sẽ có được ODE tương tự bằng cơ học chất rắn. Nó chỉ cảm thấy đúng.

Các ký hiệu và giả thuyết:

Chúng ta đang ở trong mặt phẳng với các vectơ cơ sở exey .

A là tâm của bánh sau. B là tâm của bánh trước. Chiều dài của xe đạp L là khoảng cách giữa AB . Góc giữa ey và vectơ ABφ . Góc giữa AB và bánh trước là θ .

Lý do trực quan:

Chúng tôi giả sử rằng, tại một thời điểm t nhất định , A (t) có vận tốc V (t) colinear với AB . Do đó, đối với một dấu thời gian vô hạn dt ,

A (t + dt) = A (t) + V (t) .dt .

Chúng tôi cũng cho rằng, vào thời điểm t , bánh xe phía trước không trôi, tức là tốc độ của B là colinear với sự chỉ đạo của bánh trước, tức là tạo thành một góc θ với AB . Ta gọi là vectơ đơn vị tạo thành một góc θ với AB , tức là vectơ đơn vị có cùng hướng với bánh trước.

Do đó, tại t + dt ,

B (t + dt) = B (t) + λ.Uθ

cho một thực nhất định, tích cực λ như vậy mà chiều dài của xe đạp L được bảo toàn:

khoảng cách (A (t + dt), B (t + dt)) = L

Tính toán:

Phương trình cuối cùng này chuyển thành

Norm² (B (t) + λ.Uθ - A (t) - V (t) .dt) = L²

nhưng B (t) , theo định nghĩa, là A (t) + L.Uφ , do đó λ phải thỏa mãn phương trình

Norm² (L.Uφ + .Uθ - V (t) .dt) = L² .

Các giải pháp, tất nhiên, là độc lập với φ kể từ khi vấn đề là như nhau khi các điểm xe đạp theo hướng tích cực y . Do đó, nếu chúng ta gọi là R ma trận xoay với góc , λ phải là giải pháp tích cực của

Norm² (L.ey; + λ.Uθ - RV (t) .dt) = L² .

Sau một vài tính toán, nếu chúng ta gọi v là chỉ tiêu của V , bạn sẽ nhận được

= L. (sqrt (1 - (sin (θ). (1-v.dt / L)) ²) - cos (θ)) + v.dt.cos (θ) .

Đây là mã giả tôi đã sử dụng để có được hình ảnh động ở trên (thay vì sử dụng , tôi sử dụng u = U (+) vì nó đơn giản hơn):

// I start at i=1 because i=0 contains the initial values
for (int i=1; i<=N; i++)
{
    // the array in which I stored the successive A points
    Aarray[i] = Aarray[i-1] + dt*V;
    float lambda = L*( sqrt(1 - (sin(theta)*(1-v*dt/L))**2) - cos(theta) )
                   + cos(theta)*v*dt;
    // the array in which I stored the successive B points
    Barray[i] = Barray[i-1] + lambda*u;
    // the AB vector normalized
    AiBiUnit = (Barray[i] - Aarray[i])/L;
    // Refreshing the velocity of A
    V = v*AiBiUnit;
    // Refreshing u.
    // u is indeed a unit vector separated from AiBiUnit by an angle theta,
    // so you get it by rotating the newly computed AiBiUnit by an angle
    // of +theta:
    u = AiBiUnit.rotate(theta);
}

Nếu bạn lặp lại nhiều và / hoặc tăng góc lái, quỹ đạo là một vòng tròn, đó là mạch lạc, tôi tin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.