kurse:efcomputergrafik:kw4

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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  \cdot \textrm{e}^{\textrm{i} \lambda t \cdot \frac{1}{r}}\\ +v(t) & =  x'(t) =  \textrm{i}\lambda  \cdot \textrm{e}^{\textrm{i} \lambda t \cdot \frac{1}{r}}\\ 
-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) =  -\lambda^2 \cdot \frac{1}{r} \cdot \textrm{e}^{\textrm{i} \lambda t \cdot \frac{1}{r}}\\
 \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'}{|p'|}\right) = 
 +\frac{p'' - e \cdot \left( e \cdot p''\right)}{|p'|^2}
 +\]
 +mit $e=\frac{p'}{|p'|}$. Das ist bis auf den Faktor $|p'|^2$ das Gram-Schmidt Verfahren. Sachen gibts...
 ===== 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['Camera']
 +frame = 0
 +cam.animation_data_clear()
 +cam.matrix_world = ( (y.x,y.y,y.z,1), (-an.x, -an.y, -an.z, 1),  (-vv.x,-vv.y,-vv.z,1),  (pp.x, pp.y, pp.z, 0))
 +cam.keyframe_insert(data_path="rotation_euler", frame=frame)
 +cam.keyframe_insert(data_path="location", frame=frame)
 +frame+=1
 +</code>
 +Siehe auch https://blender.stackexchange.com/questions/108938/how-to-interpret-the-camera-world-matrix
 +
 +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://devtalk.blender.org/t/2-80-using-multiple-internal-scripts-breaking-change/6980 )
 +Bezier = bpy.data.texts["bezier.py"].as_module().Bezier
 +
 +obj = bpy.data.objects['mySpline']
 +
 +# Kurvenpunkte auslesen
 +mypoints=[]
 +if obj.type == 'CURVE':
 +    for subcurve in obj.data.splines:
 +        curvetype = subcurve.type
 +        if curvetype == 'BEZIER':
 +            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//3):
 +    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['Rails'])
 +except:
 +    pass
 +    
 +railsCol = bpy.data.collections.new('Rails')
 +linksCol = bpy.data.collections.new('RailLinks')
 +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,0,-9.81) # Gravitationbeschleunigung
 +hmax = 40  # Hoehe fuer v=0
 +# Bahnpunkte: Ctrl-Links, Knoten, Ctrl-Rechts
 +railspts=[[],[],[]]  # Bahnpunkte, Schiene L, Schiene R, Träger 
 +while(ldone<totalLength):
 +    dl = abstand;
 +    tnext = -1
 +    while(tnext<0):
 +        tnext = mySplines[i].forward(dl, t)
 +        if (tnext<0) : # We get the negative remaining length
 +            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,v,g)
 +    # Bahnpunkte berechnen
 +    #
 +    #
 +    #
 +    
 +
 +
 +# Blender-Kurven aus den Bahnpunkten erzeugen
 +for j in range(3):
 +    curvedata = bpy.data.curves.new(name="rail"+str(j), type='CURVE')
 +    curvedata.dimensions = '3D'
 +    objectdata = bpy.data.objects.new("rail"+str(j), curvedata)    
 +    objectdata.location = (0,0,0)
 +    objectdata.data.bevel_depth = 0.01
 +
 +    railsCol.objects.link(objectdata)
 + 
 +    polyline = curvedata.splines.new('BEZIER'   
 +    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 = 'ALIGNED'
 +        point.handle_right_type = 'ALIGNED'
 +
 +</code>
  • kurse/efcomputergrafik/kw4.1579723638.txt.gz
  • Last modified: 2020/01/22 21:07
  • by Ivo Blöchliger