Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
kurse:efcomputergrafik:kw4 [2020/01/22 21:07] Ivo Blöchliger [Effektive Beschleunigung und Komponente in Bahnnormalebene] |
kurse:efcomputergrafik:kw4 [2020/02/12 21:06] (current) Ivo Blöchliger [Beschleunigung bei konstantem Geschwindigkeisbetrag 1] |
||
---|---|---|---|
Line 141: | Line 141: | ||
\begin{align*} | \begin{align*} | ||
x(t) & = r \cdot \textrm{e}^{\textrm{i}t \cdot \frac{1}{r}}\\ | x(t) & = r \cdot \textrm{e}^{\textrm{i}t \cdot \frac{1}{r}}\\ | ||
- | v(t) & = x'(t) = \textrm{e}^{\textrm{i}t \cdot \frac{1}{r}}\\ | + | v(t) & = x'(t) = \textrm{i}\textrm{e}^{\textrm{i}t \cdot \frac{1}{r}}\\ |
- | a(t) & = v'(t) = \frac{1}{r} \cdot \textrm{e}^{\textrm{i}t \cdot \frac{1}{r}}\\ | + | a(t) & = v'(t) = -\frac{1}{r} \cdot \textrm{e}^{\textrm{i}t \cdot \frac{1}{r}}\\ |
\end{align*} | \end{align*} | ||
- | Beträgt jetzt die Geschwindigkeit $\lambda$ anstatt 1, ändern sich die Gleichungen wie folgt: | + | Beträgt jetzt der Betrag der Geschwindigkeit $\lambda$ anstatt 1, ändern sich die Gleichungen wie folgt: |
\begin{align*} | \begin{align*} | ||
x(t) & = r \cdot \textrm{e}^{\textrm{i} \lambda t \cdot \frac{1}{r}}\\ | x(t) & = r \cdot \textrm{e}^{\textrm{i} \lambda t \cdot \frac{1}{r}}\\ | ||
- | v(t) & = x'(t) = \lambda | + | v(t) & = x'(t) = |
- | a(t) & = v'(t) = \lambda^2 \cdot \frac{1}{r} \cdot \textrm{e}^{\textrm{i} \lambda t \cdot \frac{1}{r}}\\ | + | a(t) & = v'(t) = |
\end{align*} | \end{align*} | ||
- | D.h., wenn die Geschwindigkeit von $1$ auf $\lambda$ erhöht wird, wird die Beschleunigung mit $\lambda^2$ multipliziert. | + | D.h., wenn der Betrag der Geschwindigkeit von $1$ auf $\lambda$ erhöht wird, wird der Betrag der Beschleunigung mit $\lambda^2$ multipliziert. |
===== Beschleunigung bei konstantem Geschwindigkeisbetrag 1 ===== | ===== Beschleunigung bei konstantem Geschwindigkeisbetrag 1 ===== | ||
Line 179: | Line 179: | ||
Diese zweite Ableitung berechnen wir nummerisch durch Ableiten der ersten: | Diese zweite Ableitung berechnen wir nummerisch durch Ableiten der ersten: | ||
\[ | \[ | ||
- | a_n(t(\ell)) := \frac{\textrm{d}v_n(\ell)}{\textrm{d}\ell} \approx \frac{v_n(t(\ell)+\Delta t)-v_n(t(\ell)-\Delta t)}{\ell(t+\Delta t)-\ell(t-\Delta t)} \approx \frac{v_n(t(\ell)+\Delta t)-v_n(t(\ell)-\Delta t)}{|p(t+\Delta t)-p(t-\Delta t)|} | + | a_n(t(\ell)) := \frac{\mathrm{d}v_n(\ell)}{\mathrm{d}\ell} \approx \frac{v_n(t(\ell)+\Delta t)-v_n(t(\ell)-\Delta t)}{\ell(t+\Delta t)-\ell(t-\Delta t)} \approx \frac{v_n(t(\ell)+\Delta t)-v_n(t(\ell)-\Delta t)}{|p(t+\Delta t)-p(t-\Delta t)|} |
\] | \] | ||
+ | Algebraisch erhält man folgendes: | ||
+ | \[ | ||
+ | \frac{\mathrm{d}}{\mathrm{d}\ell} \left(\frac{p' | ||
+ | \frac{p'' | ||
+ | \] | ||
+ | mit $e=\frac{p' | ||
===== Effektive Beschleunigung und Komponente in Bahnnormalebene ===== | ===== Effektive Beschleunigung und Komponente in Bahnnormalebene ===== | ||
Sei $v_{\text{eff}}(t) \in \mathbb{R}$ der Betrag der effektiven Bahngeschwindigkeit im Punkt zum entsprechenden $t$-Parameter. | Sei $v_{\text{eff}}(t) \in \mathbb{R}$ der Betrag der effektiven Bahngeschwindigkeit im Punkt zum entsprechenden $t$-Parameter. | ||
Line 207: | Line 213: | ||
===== Bau der Bahn ===== | ===== Bau der Bahn ===== | ||
- | In geeigneter Schrittgrösse der Kurve entlang gehen, an jedem Punkt | + | In geeigneter Schrittgrösse der Kurve entlang gehen, an jedem Punkt mit $K(t)$ Schienen-Punkte definieren. |
+ | Eventuell Stützen definieren. | ||
+ | Blender Code analog zur Generierung der glatten Kurve. | ||
===== Simulation der Bewegung ===== | ===== Simulation der Bewegung ===== | ||
Zustand: $t$ (Ort auf der Bahn), $v_{\text{eff}}$ (aktueller Betrag der Geschwindigkeit) | Zustand: $t$ (Ort auf der Bahn), $v_{\text{eff}}$ (aktueller Betrag der Geschwindigkeit) | ||
+ | Schritt: Zeit um 1/framerate vorrücken, der Bahn folgen (z.B. um die Strecke, die mit $v_{\text{eff}}$ in dieser Zeit zurückgelegt würde, oder genauere schrittweise Simulation). Aus der Höhendifferenz und eventuell Reibung die neue Geschwindigkeit berechnen. | ||
+ | |||
+ | Kamera entsprechend positionieren und Keyframe setzen: | ||
+ | |||
+ | <code python> | ||
+ | cam = bpy.data.objects[' | ||
+ | frame = 0 | ||
+ | cam.animation_data_clear() | ||
+ | cam.matrix_world = ( (y.x, | ||
+ | cam.keyframe_insert(data_path=" | ||
+ | cam.keyframe_insert(data_path=" | ||
+ | frame+=1 | ||
+ | </ | ||
+ | Siehe auch https:// | ||
+ | |||
+ | D.h. die erste Koordinatenrichtung ist rechts, die zweite oben und die dritte ist entgegen der Blickrichtung. | ||
+ | |||
+ | ===== Blender ===== | ||
+ | Bezier Klasse laden in Blender: | ||
+ | <code python bahn.py> | ||
+ | # Nimmt die Bezierkurven aus myspline und erzeugt | ||
+ | # die Bahn und die Kamera-Animation | ||
+ | |||
+ | # Import in Blender 2.8 (see https:// | ||
+ | Bezier = bpy.data.texts[" | ||
+ | |||
+ | obj = bpy.data.objects[' | ||
+ | |||
+ | # Kurvenpunkte auslesen | ||
+ | mypoints=[] | ||
+ | if obj.type == ' | ||
+ | for subcurve in obj.data.splines: | ||
+ | curvetype = subcurve.type | ||
+ | if curvetype == ' | ||
+ | for bezpoint in subcurve.bezier_points: | ||
+ | mypoints.append(bezpoint.handle_left) | ||
+ | mypoints.append(bezpoint.co) | ||
+ | mypoints.append(bezpoint.handle_right) | ||
+ | | ||
+ | |||
+ | # Sammlung von Bezierkurven erzeugen | ||
+ | mySplines = [] | ||
+ | numpoints = len(mypoints) | ||
+ | totalLength = 0 | ||
+ | for i in range(numpoints// | ||
+ | mySplines.append(Bezier((mypoints[i*3+1], | ||
+ | mypoints[i*3+2], | ||
+ | mypoints[(i*3+3)%numpoints], | ||
+ | mypoints[(i*3+4)%numpoints]))) | ||
+ | totalLength+=mySplines[-1].length() | ||
+ | |||
+ | |||
+ | # Bahn erzeugen | ||
+ | try: | ||
+ | bpy.ops.collection.objects_remove(bpy.data.collections[' | ||
+ | except: | ||
+ | pass | ||
+ | | ||
+ | railsCol = bpy.data.collections.new(' | ||
+ | linksCol = bpy.data.collections.new(' | ||
+ | railsCol.children.link(linksCol) | ||
+ | bpy.context.scene.collection.children.link(railsCol) | ||
+ | |||
+ | abstand = 0.2 # Bahnpunkte | ||
+ | ldone = 0 # Erledigte Bahnstrecke | ||
+ | i=0 # Aktuelle Bezierkurve | ||
+ | t = 0 # Aktuelle t-Parameter | ||
+ | g = Vector(0, | ||
+ | hmax = 40 # Hoehe fuer v=0 | ||
+ | # Bahnpunkte: Ctrl-Links, Knoten, Ctrl-Rechts | ||
+ | railspts=[[], | ||
+ | while(ldone< | ||
+ | dl = abstand; | ||
+ | tnext = -1 | ||
+ | while(tnext< | ||
+ | tnext = mySplines[i].forward(dl, | ||
+ | if (tnext< | ||
+ | i=(i+1)%numSplines | ||
+ | t = 0 | ||
+ | dl=abs(tnext) | ||
+ | else: | ||
+ | ldone+=dl | ||
+ | t = tnext | ||
+ | # Potentielle Energie mgh | ||
+ | ekin = (hmax-mySplines[i].x(t).z)*abs(g.z) | ||
+ | # Ek = 1/2 * m * v^2 | ||
+ | v = (2*ekin)**0.5 | ||
+ | # Koordinatensystem (vorne, oben, rechts) | ||
+ | k = mySplines[i].koordsyst(t, | ||
+ | # Bahnpunkte berechnen | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | | ||
+ | |||
+ | |||
+ | # Blender-Kurven aus den Bahnpunkten erzeugen | ||
+ | for j in range(3): | ||
+ | curvedata = bpy.data.curves.new(name=" | ||
+ | curvedata.dimensions = ' | ||
+ | objectdata = bpy.data.objects.new(" | ||
+ | objectdata.location = (0,0,0) | ||
+ | objectdata.data.bevel_depth = 0.01 | ||
+ | |||
+ | railsCol.objects.link(objectdata) | ||
+ | |||
+ | polyline = curvedata.splines.new(' | ||
+ | polyline.bezier_points.add(len(railspts[j])-1) | ||
+ | |||
+ | for idx, (h1, knot, h2) in enumerate(railspts[j]): | ||
+ | point = polyline.bezier_points[idx] | ||
+ | point.co = knot | ||
+ | point.handle_left = h1 | ||
+ | point.handle_right = h2 | ||
+ | point.handle_left_type = ' | ||
+ | point.handle_right_type = ' | ||
+ | |||
+ | </ |