Saya memiliki permainan sepeda top down sederhana yang saya coba tambahkan kemudi. Saya ingin tahu bagaimana saya menggunakan tajuk roda depan untuk menentukan tajuk dan kecepatan sepeda.
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;
}
Saya sudah mencoba menerapkan kecepatan sepeda ke roda depan dan belakang dan menggunakan perbedaan posisi di sana untuk menentukan arah sepeda, tetapi seretan ke depan membuatnya membingungkan.
Edit berdasarkan komentar madshogo
Jawaban:
Ok, saya kembali dengan hasil!
Saya mencoba dua pendekatan:
Menggunakan mekanika padatan untuk mendapatkan persamaan diferensial yang mengatur pergerakan pusat roda: input dari sistem "sepeda" adalah torsi di roda belakang dan sudut roda depan, dan outputnya adalah kinematika dari pusat roda. Tapi saya menyerah, itu sulit!
Mencoba menebak apa yang terjadi dari sudut pandang geometris ketika roda belakang "mendorong" roda depan ke depan dengan roda depan tidak lurus. Metode ini secara langsung menghasilkan persamaan kenaikan sangat kecil (lihat di bawah) dari mana Anda bisa mendapatkan persamaan diferensial yang sebenarnya. Saya belum mencoba memanipulasi persamaan pertama ini untuk mendapatkan ODE tetapi dugaan saya adalah bahwa saya akan mendapatkan ODE yang sama menggunakan mekanika padatan. Rasanya benar.
Notasi dan hipotesis:
Kami berada di pesawat dengan basis vektor ex dan ey .
A adalah pusat dari roda belakang. B adalah pusat dari roda depan. Panjang sepeda L adalah jarak antara A dan B . Sudut antara ey dan vektor AB adalah φ . Sudut antara AB dan roda depan adalah θ .
Dasar pemikiran intuitif:
Kita mengira bahwa, pada t instan tertentu , A (t) memiliki kecepatan V (t) kolinear dengan AB . Oleh karena itu, untuk timestep dt sangat kecil ,
A (t + dt) = A (t) + V (t) .dt .
Kami juga menganggap bahwa, pada waktu t , roda depan tidak melayang, yaitu kecepatan B adalah kolinear dengan arah roda depan, yaitu membentuk sudut θ dengan AB . Kami memanggil Uθ vektor satuan yang membentuk sudut θ dengan AB , yaitu vektor satuan dengan arah yang sama dengan roda depan.
Oleh karena itu, pada t + dt ,
B (t + dt) = B (t) + λ.Uθ
untuk λ nyata dan positif tertentu sedemikian sehingga panjang sepeda L dilestarikan:
jarak (A (t + dt), B (t + dt)) = L
Perhitungan:
Persamaan terakhir ini diterjemahkan menjadi
norm² (B (t) + λ.Uθ - A (t) - V (t) .dt) = L²
tetapi B (t) , menurut definisi, adalah A (t) + L.Uφ , sehingga λ harus memenuhi persamaan
norm² (L.Uφ + λ.Uθ - V (t) .dt) = L² .
Solusinya, tentu saja, tidak tergantung dari φ karena masalahnya sama ketika sepeda menunjuk ke arah positif y . Oleh karena itu, jika kita memanggil R matriks rotasi dengan sudut -φ , λ harus menjadi solusi positif
norm² (L.ey; + λ.Uθ - RV (t) .dt) = L² .
Setelah beberapa perhitungan, jika kita memanggil v norma V , Anda dapatkan
λ = L. (sqrt (1 - (sin (θ). (1-v.dt / L)) ²) - cos (θ)) + v.dt.cos (θ) .
Inilah pseudocode yang saya gunakan untuk mendapatkan animasi di atas (alih-alih menggunakan Uθ , saya menggunakan u = U (θ + φ) karena lebih sederhana):
Jika Anda mengulang banyak dan / atau meningkatkan sudut kemudi, lintasannya adalah sebuah lingkaran, yang koheren, saya percaya.
sumber