1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
# -*- indent-tabs-mode: t -*-
# Soya 3D tutorial
# Copyright (C) 2001-2004 Jean-Baptiste LAMY
# Copyright (C) 2008 Thibaut GIRKA
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# background-1: Adding a background (using widget, which is now deprecated)
# This lesson is the same as basic-1.py, except that we have added a background.
# Imports sys, os modules and the Soya module.
import sys, os, os.path, soya, soya.widget
# Initializes Soya (creates and displays the 3D window).
soya.init()
# Add the path "tutorial/data" to the list of soya data path. When soya loads some data,
# like a model or a texture, it always searches the data in soya.path.
# soya.path behaves like Python's sys.path.
# Soya's data directory should be organized as following :
# ./images : the image file
# ./materials : the materials (including textures, optimized forms of images)
# ./worlds : the model
# ./models : the optimized model
# Notice the use of sys.argv to get the directory where this script lives.
soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))
# Creates a scene. The scene is a World, which contains all the 3D elements we are
# about to render. A World is a 3D object that can contain other 3D objects (including
# other worlds) ; think to World as a group of 3D objects.
scene = soya.World()
# Loads the sword model (from file "tutorial/data/models/sword.data").
# A model is an optimized model ; the sword model we use here was designed in Blender.
# Model.get is a static method that returns the object of the corresponding filename,
# and loads it if needed, i.e. if you call get a second time, it will return the same
# object instead of loading it again.
# Any dependancy of the model (e.g. materials) are loaded too.
sword_model = soya.Model.get("sword")
# Create the model.
# A Body displays a model. The first argument of the Body constructor is the
# parent of the new body ; here we put the body in the scene. The parent must be
# a World or a World derivative (or None).
# (this is a convention, similarly to Tkinter, where the first argument of a
# widget's constructor is the master).
# The second argument of the Body constructor is the model : our sword model.
sword = soya.Body(scene, sword_model)
# The default position is 0.0, 0.0, 0.0
# To view it better, we moves the sword to the right.
sword.x = 1.0
# Rotates the sword on the Y axis, of 60.0 degrees.
# (in Soya, all angles are in degrees).
sword.rotate_y(90.0)
# Creates a light in the scene (same convention: the first argument of the
# constructor is the parent) and moves it to (1.5, 2.0, 0.2).
light = soya.Light(scene)
light.set_xyz(0.5, 0.0, 2.0)
# Creates a camera in the scene and moves it to z = 5.0. The camera looks in the
# -Z direction, so, in this case, towards the cube.
#
# When relevant, Soya always considers the X direction to be on the right,
# the Y direction to be on the top and the -Z to be the front.
# (Using -Z for front seems odd, but using Z for front makes all coordinate systems
# indirect, which is a mathematical nightmare !)
camera = soya.Camera(scene)
camera.z = 2.0
# Say to Soya that the camera is what we want to be rendered.
# Make a widget group
soya.set_root_widget(soya.widget.Group())
# Create the background material, and the background widget
background_material = soya.Material(soya.Image.get('block2.png'))
background = soya.widget.Image(None, background_material)
background.resize_style = soya.widget.WIDGET_RESIZE_MAXIMIZE
# Make the scene transparent so we can see the background
scene.atmosphere = soya.NoBackgroundAtmosphere()
# Add the widgets: the background and the camera
soya.root_widget.add(background)
soya.root_widget.add(camera)
# Uncomment this line to save a 320x240 screenshot in the results directory.
#soya.render(); soya.screenshot().resize((320, 240)).save(os.path.join(os.path.dirname(sys.argv[0]), "results", os.path.basename(sys.argv[0])[:-3] + ".jpeg"))
# Creates an 'MainLoop' for the scene, and launch it.
# The MainLoop is the object that manages the Soya's mainloop. It take care of :
# - looping
# - regulating the frame rate to 40 FPS
# - smoothing the animation
# - computing FPS
# - rendering the screen
soya.MainLoop(scene).main_loop()
|