[PYTHON] PyODE Tutorial 2

Beispiel für die Ausführung eines PyODE-Beispiels

Ich habe versucht, "Tutorial 2" von Honke PyODE-sama site auszuführen.

-- Klicken Sie hier für weitere Artikel zur Tut-Implementierung ↓ ・ "Tutorial 1" (Fallendes Objekt, Matplotlib-Zeichnung hinzugefügt) ・ "Tutorial 3" (Mehrkörperkontakt, OpenGL)

--

Das Hauptthema ist "Tutorial 2" Der ursprüngliche Inhalt ist

Die Einstellung der Winkelgeschwindigkeit ist hier auskommentiert. Ich habe auch die Bildschirmgröße und Farbe geändert, um ein GIF-Video auszugeben.

Umwelt etc.

・ Win10 ・ Python 3.8.0 64bit ・ Pyo de 0.15.2 ・ Pygame 1.9.6 ・ Kissen 7

Änderung beim Ausführen von "Tutorial 2" wie es ist

In meiner Umgebung wurde der Code auf der PyODE-Site so ausgeführt, wie er war.

Auszug aus der Pygame-Fehlermeldung


pygame.draw.circle(srf, rgb, coord( xyz ), 20, 0)
TypeError: integer argument expected, got float

Aktion: In der Routine coord () am Anfang des Codes Ich habe jeden der beiden zurückgegebenen Werte in int () eingeschlossen.

Beschäftige dich mit Pygame-Fehlern


def coord(x,y):
    "Convert world coordinates to pixel coordinates."
    return int(320+170*x), int(400-170*y)

Ergebnis

Bei der Ausführung wird die 2D-Videotabelle von Pygame angezeigt. Hier wird die im GIF-Format gespeicherte Datei veröffentlicht. tutorial_2.gif

Es gibt nur 3 ODE-Objekte. Die Linie wird gerade gezeichnet. Schwarze Objekte sind im Raum fixiert. (Dieses Objekt muss nicht sein.) Es wurden Änderungen an den Gelenkeinstellungen, Zeichnungseinstellungen usw. vorgenommen.

Code (alle)

Es sind noch einige unnötige Teile übrig Da es sich um eine kleine Schnur handelt, werde ich sie insgesamt anbringen.

Python3


# pyODE example 2: Connecting bodies with joints
##  Modified: Window-sizing, jointing-condition, and others.

import pygame
from pygame.locals import *
import ode


W = 640
H = 640
CX = 320
CY = 320
S = 80.
def coord(xyz):
    (x,y,z) = xyz
    "Convert world coordinates to pixel coordinates."
    return int( CX +S*x ), int( CY -S*y)



from PIL import Image, ImageDraw

def storeImage( srfc, images ):
    if NI_MAX <= len(images):
        return
    s = srfc
    buf = s.get_buffer()
    im = Image.frombytes( "RGBA", s.get_size(), buf.raw )
    B,G,R,A = im.split()
    img = Image.merge("RGBA",(R,G,B,A))
    images.append(img)

def gif(images):
    print(' @ gif(), ')
    savepath = 'tutorial_2.gif'

    image0 = images[0]
    image_end = images[-1]
    for i in range( 5 ):
        images.insert(0,image0)
    for i in range( 5 ):
        images.append(image_end)

    images[0].save( savepath, save_all=True, append_images=images[1:], optimize=not False, duration=100, loop=0 )
    print(' Exported : [%s]'%savepath)

NI_MAX = 10000
images=[]



# Initialize pygame
pygame.init()

# Open a display
srf = pygame.display.set_mode( (W,H) )

#

# Create a world object
world = ode.World()
world.setGravity((0,-9.81,0))

#

# Create two bodies
body0 = ode.Body(world)
M = ode.Mass()
M.setSphere(2500, 0.05)
body0.setMass(M)
body0.setPosition( (0,0,0) )

body1 = ode.Body(world)
M = ode.Mass()
M.setSphere(2500, 0.05)
body1.setMass(M)
body1.setPosition( (1,1,0) )

body2 = ode.Body(world)
M = ode.Mass()
M.setSphere(2500, 0.05)
body2.setMass(M)
body2.setPosition( (0,2,0) )

bodys = [body0,body1,body2]


# Connect body0 with the static environment
if True:
    j0 = ode.BallJoint(world)
    j0.attach(body1, ode.environment)
    j0.setAnchor( body0.getPosition() )
if False:
    j0 = ode.HingeJoint(world)
    j0.attach(body1, ode.environment)
    j0.setAnchor( body0.getPosition() )
    j0.setAxis( (0,0,1) )

    #j0.setParam(ode.ParamVel, 3)
    #j0.setParam(ode.ParamFMax, 22)

# Connect body1 with body0
j01 = ode.BallJoint(world)
j01.attach(body0, body1)
j01.setAnchor( body0.getPosition() )

# Connect body2 with body1
j12 = ode.BallJoint(world)
j12.attach(body1, body2)
j12.setAnchor( body1.getPosition() )

joints = [j0, j01, j12]




RGBs = { body0:(63, 63, 63), body1:(127, 63, 63), body2:(63, 127, 63) }


####################################################
# Simulation loop...

fps = 50
dt = 1.0/fps
loopFlag = True
clk = pygame.time.Clock()

ti = -1
while loopFlag:
    ti += 1
    events = pygame.event.get()
    for e in events:
        if e.type==QUIT:
            loopFlag=False

        if e.type==KEYDOWN:
            gif( images )
            loopFlag=False

    # Clear the screen
    srf.fill((255,255,255))


    for joint in joints:
        if joint is j0:
            continue
        rgb = (127,127,127)
        
        SIMPLE=False
        if SIMPLE:
            p0 = coord( joint.getBody(0).getPosition() )
            p1 = coord( joint.getBody(1).getPosition() )
        else:    ####        joint.attach(body, ode.environment)Entsprechung zur Ankerposition bei und Farbcodierung der Linie
            b_move = None
            b0 = joint.getBody(0)
            if b0:
                if b0.getPosition() != joint.getAnchor():
                    b_move = b0
            if None is b0:
                p0 = coord( joint.getAnchor() )
                if None is p0:
                    p0 = coord( body0.getPosition() )
            else:
                p0 = coord( b0.getPosition() )
            b1 = joint.getBody(1)
            if b1:
                if b1.getPosition() != joint.getAnchor():
                    b_move = b1
            if None is b1:
                p1 = coord( joint.getAnchor() )
                if None is p1:
                    p1 = coord( body0.getPosition() )
            else:
                p1 = coord( b1.getPosition() )
        
            rgb = RGBs[b_move]

        lw = 5
        pygame.draw.line( srf, rgb, p0,p1, lw)

    for body in bodys:
        xyz = body.getPosition()
        rgb = RGBs[body]
        pygame.draw.circle(srf, rgb, coord( xyz ), 20, 0)
    
    pygame.display.flip()

    if ti % 4 == 0:
        storeImage(srf,images)

    # Next simulation step
    world.step(dt)

    # Try to keep the specified framerate    
    clk.tick(fps)
    
    #if not loopFlag:
    #    gif( images )

Recommended Posts

PyODE Tutorial 2
PyODE Tutorial 1
PyODE Tutorial 3
sqlalchemy Tutorial
Python-Tutorial
TensorFlow Tutorial Tutorial
RabbitMQ Tutorial 5 (Thema)
Quantopian Tutorial LEKTION 8
Quantopian Tutorial LEKTION 1, 2
Quantopian Tutorial LEKTION 6
Python Django Tutorial (5)
RabbitMQ Tutorial 6 (RPC)
Django Tutorial Memo
Ryu Tutorial Nachtrag
Python Django Tutorial (8)
Python Django Tutorial (6)
Starten Sie das Django Tutorial 1
Quantopian Tutorial LEKTION 9
Quantopian Tutorial LEKTION 5
Quantopian Tutorial LEKTION 3
Quantopian Tutorial LEKTION 7
5 Minuten gRPC-Tutorial
Python Django Tutorial (7)
Python Django Tutorial (1)
Quantopian Tutorial LEKTION 4
Python Django Tutorial Tutorial
Versuchen Sie es mit PyODE
Quantopian Tutorial LEKTION 11
Python Django Tutorial (3)
RabbitMQ Tutorial 4 (Routing)
zipline Anfänger Tutorial
[Übersetzung] Hyperopt-Tutorial
Python Django Tutorial (4)