2B sprite dönme kuvvetinin hesaplanması


35

Birisinin aşağıdaki senaryoyu hesaplamada zarif bir yolu olup olmadığını merak ediyorum.

(N) kare sayısının, rastgele şeklin bir nesnesine sahibim, ancak hepsinin dikdörtgen olduğunu iddia edeceğiz.

Yerçekimi olmadan uğraşıyoruz, bu yüzden uzaydaki nesneyi yukarıdan aşağıya bir bakış açısıyla düşünün. Nesneye belirli bir karede kuvvet uygulıyorum (aşağıda gösterildiği gibi).

Bir güç uygulamak

Uygulanan yerde, uygulanan kuvvete bağlı olarak dönme açısını nasıl hesaplarım? Merkez kareye uygulanırsa düz gider. Merkezden uzaklaştıkça nasıl davranmalı? Dönme hızını nasıl hesaplarım?


Nesne döndükçe zaman içinde kuvvete ne olmak istiyorsunuz? Her zaman aynı kareye aynı yönde uygulanır mı? Nesnenin kenarı boyunca "süpürüyor" mu? Verdiğiniz bilgilerle, sadece karşılık gelen dönme kuvvetini (aka. Tork) elde edebilirsiniz, ancak bundan bir dönme hızını çıkarmak istiyorsanız, bir itme sağlamanız (bir kuvvetten ziyade) veya nasıl açıklamanız gerekir zaman geçtikçe kuvvet uygulanmalıdır.
sam hocevar

Dürüst olmak gerekirse, bu tamamen temel bir mekanik meselesi olduğu için, muhtemelen physics.stackexchange.com için daha iyi bir soru olacaktır.
BlueRaja - Danny Pflughoeft 10:11

Yanıtlar:


44

Torku hesaplamaya çalışıyorsun. Tork, uygulanan kuvvet F'ye, uygulama noktasına ve nesnenin kütle merkezine bağlıdır.

1) Kütle Merkezi . Nesnenin kütle merkezini tanımlayın.

2) Uygulama Noktası : Kuvvetin etki ettiği noktayı tanımlayın.

3) Moment Arm : Yukarıda tanımlanan iki nokta arasındaki mesafe.

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4) Açısal kuvvet : Kuvvetinizi F iki ortogonal vektöre ayırın, biri 3'te çizgiye Paralel) ve bir Dik. Paralel bileşen açısal momentumu etkilemez. Dik olan bunu yapar. Paralel bileşeni vektör projeksiyonu ile hesaplayabilirsiniz. Dikey bileşeni almak için bunu orijinalden çıkarabilirsiniz. Sahte kodda ( dotnokta ürün anlamına gelir)

Vector myForce
Vector momentArm

parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent

5) Tork : Kuvvetin dik bileşeni moment kolunun uzunluğu ile çarpılır.

Vector angularForce
Vector torque = angularForce * momentArm.Length

Tork'tan açısal hıza ulaşmak için:

1) Atalet Momenti : Belirli bir nesnenin ne kadar dönme ataletine sahip olduğunun tanımı. Örneğin, aynı kütleli bir küreden daha uzun bir çubuğu döndürmek daha fazla tork gerektirir. Gerçekçilikten endişe duymuyorsanız, atalet momentinin kütle ile ilgili olduğunu iddia edebilir veya nesnenin şeklini ve kütlesini tamamen görmezden gelebilirsiniz.

2) Açısal ivme :

Vector angularAcceleration = torque / momentOfInertia

3) Açısal Hız : Açısal hız, tork uygulandığı sürece artmaya devam edecektir. Bir formül aşağı yukarı olacak şekilde "süresi en Açısal Hız T kadar açısal hızlanma kadar kümülatif toplamıdır T ". Bu yalancı kodla ifade edilir.

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;

Ancak harika bilgiler, en belirsiz olduğum kısım, tork kuvvetinin ne olması gerektiğini nasıl belirleyeceğimizdir. Açıkladığınız gibi tüm bileşenlere sahibim.
jgallant

@Jon: 1 - 3 adımlarına sahip olduğunuz ve 4. adımı nasıl hesaplayacağınız anlamına gelmeyen bileşenlere sahip misiniz? Bu öncelikle zor adım. Orada biraz daha detay ekleyeceğim.
Jimmy,

3
Oryantasyon, açısal hızın kümülatif toplamıdır orientation += angularVelocity * elapsedSeconds, yanlıştır, çünkü zaman adımındaki hızı abartır, yani farklı kare hızlarının farklı oryantasyonlar vereceği anlamına gelir. Uygun bir formül olacaktır: float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;. Ayrıca, yerçekimi olmadığından, bunun yerine “kütle merkezini” kullanmanızı öneririm. Yine de çok iyi bir açıklama için +1.
sam hocevar

1
Dikey kuvvetin bir kısmı kütle merkezini hızlandırmak için hareket edecektir ve kuvvet kütle merkezine daha yakın uygulandığında, bu faktör artar. Cevap iyi ve çok açık, ancak bu konuda eksik görünüyor.
Sam Watkins

Kendi yorumuma cevap vermek için Chris Hecker'in fizik hakkındaki makalelerini okuyorum: chrishecker.com/Rigid_body_dynamics . Herhangi bir noktada bir kuvvet veya dürtü, kütle merkezinde F = ma veya a2 = a1 + p'ye göre kütle merkezi üzerinde iyi bilinen bir etkiye sahip olduğu anlaşılıyor. Bu, doğrusal momentumun korunumu yasasından kaynaklanmaktadır. Yarıçapa dik olan kuvvete ait bileşen ayrıca Jimmy'nin cevabında açıklandığı gibi bir tork ve açısal momentumda değişime neden olur.
Sam Watkins

7

eğer kuvvetler çok güçlü değilse, onları birleştiren çok sayıda nokta ve yay kullanarak dönüşü simüle etmek çok daha kolaydır . Bu durumda, şeklinizi yalnızca yaylarla birbirine bağlanmış çok sayıda noktadan meydana getirdiğinizi varsayıyorsunuz. her nokta kütleyi temsil eder ve şekildeki her şey sıfıra eşit kütle içerir.

bahar ve noktalar

Yukarıdaki resimde siyah nokta kütleleri ve kırmızı çizgi yayları temsil etmektedir. Daha sonra kuvveti uygulamak için onu en yakın noktaya uygulamanız gerekir ve nesnenizin istediğiniz gibi döneceğini görürsünüz. Şeklinizi sağlam bir yapıya benzetmek için yüksek sönümleme değeri ve yüksek k değeri olan yayları tanımlamak daha iyidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.