Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Probestudium / 2013 / WS I: 3D-Programmierung / Tutorials / Mouse-Events / PSI_bounce_3.py


Inhaltsbereich

PSI_bounce_3.py

PSI_bounce_3.py — text/python-source, 2 KB (2324 bytes)

Dateiinhalt

# -*- coding: utf-8 -*-
# veränderte Version von bounce.py (/examples)
# Fallbeschleunigung

from visual import *
from visual.controls import *

# KONSTANTEN - diese WERTE zum Test ändern!
ERDBESCHLEUNIGUNG = 9.81
REBOUND = 0.9


# grüne Bodenplatte
floor = box(pos=(0,-5,0),length=4, height=0.5, width=4, color=color.green)
# Ball
ball = sphere(pos=(0,5,0))
# Geschwindigkeitsvektor (testweise x-/z-Anteil variieren...!)
ball.velocity = vector(0,-1,0)

# Beschriftungen für ERDBESCHLEUNIGUNG und REBOUND
label(pos=ball.pos, text="g=%s"%ERDBESCHLEUNIGUNG, xoffset=50,yoffset=0, height=10, border=6, font='sans')
label(pos=floor.pos, text="r=%s"%REBOUND         , xoffset=50,yoffset=0, height=10, border=6, font='sans')


scene.autoscale = 1                     # Skalieren ausgeschaltet
pick=None	                              # ein Element mit der Maus ge"pick"ed?
dt = 0.015                              # Delta t - Zeitinkrement 

while True:
    rate(150)                           # max. 150 Berechnungen pro Sekunde
    if scene.mouse.events:
        m1 = scene.mouse.getevent()     # Mausevent einfangen
        if m1.pick == ball and m1.drag: # ist Maus auf Ball und wird gezogen?
            drag_pos = m1.pickpos       # Zugposition übernommen
            pick = m1.pick              # pick aktiviert
        elif m1.drop:                   # falls Maus wieder losgelassen...
            ball.color=color.white      # alte Ballfarbe reaktiviert
            pick = None                 # pick deaktiviert
    if pick:                            # falls pick aktiviert...
        # Projektion auf bestehende xy-Ebene, auch wenn rotiert
        new_pos = scene.mouse.project(normal=(0,0,1))
        ball.color=color.yellow             # färbe Ball gelb  
        if new_pos != drag_pos:             # falls Position verändert...
            # offset for where the ball was clicked:
            pick.pos += new_pos - drag_pos  # übernehme neue Position
            drag_pos = new_pos	             # aktualisiere
    else:
        # Ball fällt...
        ball.pos = ball.pos + ball.velocity*dt          
        if ball.y < -3.80 and ball.velocity.y < 0.1:    # falls
            ball.velocity.y = -REBOUND*ball.velocity.y
        else:
            ball.velocity.y = ball.velocity.y - ERDBESCHLEUNIGUNG*dt  #


Funktionsleiste