Skip to main content

A Python library for creating 3D basic shape models and animations with Physics.

Project description

CubicPy

日本語 | English

CubicPy Logo

CubicPy - A 3D programming learning app for placing and building physics objects with code

Call it "CubicPy" - or simply "CuPy" for short!

Application Description

CubicPy is an application that allows you to place objects in 3D space using Python code and build worlds that operate with realistic physics simulations. You can freely place boxes, spheres, and other objects to create structures and learn programming while experiencing physical laws such as gravity and collisions.

CubicPy Sample Animation Gif

The constructed objects and structures can be observed undergoing realistic collapse processes by tilting the ground or removing objects using physics simulations. You can also change the gravity factor to observe physical behavior under different gravitational environments.

Installation

pip install cubicpy

Using the cubicpy Command

After installation, you can easily run from the command line:

# Run a randomly selected sample code
cubicpy

# Display help
cubicpy --help
cubicpy -h

# Display sample list
cubicpy --list
cubicpy -l

# Run a specific sample
cubicpy --example box_tower_sample
cubicpy -e box_tower_sample

# Run your own Python file
cubicpy your_box_data_script.py

# Run with modified gravity factor (specifies the power of 10 to multiply gravity by)
cubicpy --gravity 0.01 --example box_tower_sample
cubicpy -g 0.01 -e box_tower_sample

# Run with custom window size (1280x720)
cubicpy -e box_tower_sample -w 1280,720
cubicpy --window-size 1280,720 -e box_tower_sample

Sample Code Examples

Creating a Tower of Boxes (box_tower_sample.py)

Sample box tower

# Create an array of object data
body_data = []

# Stack 10 levels of boxes
for i in range(10):
    body_data.append({
        'type': 'box',
        'pos': (0, 0, i),  # Position: x, y, z
        'scale': (1, 1, 1),  # Size: width, depth, height
        'color': (i/10, 0, 1-i/10),  # Color: red, green, blue (0-1)
        'mass': 1  # Mass (optional)
    })

Object Definition Details (for cubicpy command)

Details of object definitions to add to the body_data list:

Parameter Description Required Default Value
type Object type: 'box', 'sphere', 'cylinder' Required -
pos Position coordinates (x, y, z) Required -
scale Size (width, depth, height) Optional (1, 1, 1)
color Color (red, green, blue) - values from 0 to 1 Optional (0.5, 0.5, 0.5)
mass Mass (0: fixed object) Optional 1
color_alpha Transparency (0: transparent to 1: opaque) Optional 1
hpr Rotation degree angles (heading, pitch, roll) Optional (0, 0, 0)
base_point Position reference point Optional 0
remove Removed Object Optional False

base_point can be set to the following values:

  • 0: The corner nearest to the origin is the reference
  • 1: The center of the bottom surface is the reference
  • 2: The center of gravity is the reference

Building Worlds with the cubicpy Command

  1. Create a Python file in the format of the sample
  2. Run it with the cubicpy your_file.py command

Sample Code for API Mode

Sample api mode

from cubicpy import CubicPyApp

# Instantiate
app = CubicPyApp(gravity_factor=0.01)

# Adding individual objects
# Add objects using API
app.add_box(position=(0, 0, 0), scale=(1, 1, 1), color=(1, 0, 0))
app.add_sphere(position=(2, 0, 0),  scale=(1, 1, 1), color=(0, 1, 0))
app.add_cylinder(position=(4, 0, 0),  scale=(1, 1, 1), color=(0, 0, 1))

# Adding multiple objects (loop)
for i in range(10):
    app.add_box(
        position=(0, 5, i),
        color=(i/10, 0, 1-i/10)
    )

# Adding body_data for compatibility with cubicpy command
body_data = []
for i in range(10):
    body_data.append({
        'type': 'box',
        'pos': (0, 10, i),
        'scale': (1, 1, 1),
        'color': (i / 10, 0, 1 - i / 10),
        'mass': 1,
        'color_alpha': 1,
    })

app.from_body_data(body_data)

# Run simulation
app.run()

API Mode Method Details

CubicPyApp Class

CubicPyApp(code_file=None, gravity_factor=1)
  • code_file: Path to Python file to execute (optional)
  • gravity_factor: Gravity factor (optional, default: 1)

Object Addition Methods

Adding a Box

add_box(position=(0, 0, 0), scale=(1, 1, 1), color=(0.5, 0.5, 0.5), mass=1, color_alpha=1, remove=False)
  • position: Position coordinates (x, y, z)
  • scale: Size (width, depth, height)
  • color: Color (red, green, blue) - values from 0 to 1
  • mass: Mass (0: fixed object)
  • color_alpha: Transparency (0: transparent to 1: opaque)
  • hpr: Rotation degree angles (heading, pitch, roll)
  • base_point: Position reference
  • remove: Removed object (Boolean)

Adding a Sphere

add_sphere(position=(0, 0, 0), scale=(1, 1, 1), color=(0.5, 0.5, 0.5), mass=1, color_alpha=1, remove=False)
  • Parameters are the same as add_box

Adding a Cylinder

add_cylinder(position=(0, 0, 0), scale=(1, 1, 1), color=(0.5, 0.5, 0.5), mass=1, color_alpha=1, remove=False)
  • Parameters are the same as add_box

Generic Object Addition

add(obj_type, **kwargs)
  • obj_type: Type of object ('box', 'sphere', 'cylinder')
  • **kwargs: Object parameters (the following keyword arguments can be used)
    • position or pos: Position coordinates
    • scale: Size
    • color: Color
    • mass: Mass
    • color_alpha: Transparency
    • hpr: Rotation degree angles (heading, pitch, roll) |
    • base_point: Position reference
    • remove: Removed Object

Building Objects from body_data List

from_body_data(body_data) 
  • body_data: List of object definitions (dictionaries) as used by the cubicpy command

World Operation Methods

run()  # Build and run the world
reset()  # Reset the world

Building Worlds with API Mode

  1. Create a CubicPyApp instance in your Python script
  2. Add objects using methods like add_box(), add_sphere(), etc.
  3. Call the run() method to build and run the world
  4. If needed, use the reset() method to rebuild
  5. Run with python your_script.py

Application Controls

  • Arrow keys: Change camera angle
  • Mouse wheel: Zoom in/out
  • W/S/A/D: Tilt the ground
  • F/G: Change gravity strength
  • R: Reset
  • Z: Toggle debug display
  • X: Remove selected objects
  • ESC: Exit

Requirements

  • Python 3.9 or higher
  • Panda3D
  • Panda3D-Bullet physics engine
  • NumPy

These dependencies are automatically installed with pip install cubicpy.

Copyright

Released under the MIT License. See the LICENSE file for details.

Contribution

Bug reports and feature improvement suggestions are welcome via GitHub Issues or Pull Requests. New sample creation and documentation improvements are also welcome.


Have fun learning programming with CubicPy!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cubicpy-0.1.5-py3-none-any.whl (78.5 kB view details)

Uploaded Python 3

File details

Details for the file cubicpy-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: cubicpy-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 78.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for cubicpy-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 74676fe0c257db064beb36651311786301f1d0a2bc79847881a0fcc696ffd50b
MD5 35b54ec5c02628ea92cf6f0606ee482c
BLAKE2b-256 7f7d5ccf75578aa5cbb61a92fa428e32d835ea462db5a0fd78b40fdb902df857

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page