File: widget-background-1.py

package info (click to toggle)
soya-doc 0.14-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, squeeze, wheezy
  • size: 15,264 kB
  • ctags: 1,039
  • sloc: python: 4,334; makefile: 9; sh: 5
file content (134 lines) | stat: -rw-r--r-- 4,928 bytes parent folder | download
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()