Sharedwww / talks / 2006-05-09-sage-digipen / tutorial / modeling-1.pyOpen in CoCalc
Author: William A. Stein
1
# Soya 3D tutorial
2
# Copyright (C) 2001-2004 Jean-Baptiste LAMY
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
19
# modeling-1: Faces : the pyramid
20
# requires the basic-* lessons.
21
22
# Models are usually designed in Blender and imported in Soya (as in lesson basic-1.py),
23
# but you can also create them from scratch, using Soya primitives. Learning this is
24
# the purpose of the modeling-* tutorial series.
25
26
# In this lesson, we'll build a pyramid, made of a quad base and 4 triangles.
27
28
29
# Imports and inits Soya (see lesson basic-1.py).
30
31
import sys, os, os.path, soya
32
33
soya.init()
34
soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))
35
36
# Creates the scene.
37
38
scene = soya.World()
39
40
# Creates the World that will contain the pyramid. As previously stated, the
41
# pyramid is composed of 5 faces; this world is used to group those 5 faces
42
# (exactly like a Frame can be used in Tkinter to group different widgets).
43
# The pyramid's parent is the scene.
44
45
pyramid = soya.World(scene)
46
47
# Creates the first face, the quad base of the pyramid.
48
# The first argument of the Face constructor is the parent World (the pyramid),
49
# the second is the list of vertices and the third is the material.
50
# The number of vertices determines the Face's nature:
51
# - 1: a plot
52
# - 2: a line
53
# - 3: a triangle
54
# - 4: a quad
55
# - +: a polygon
56
57
# The vertices is a list of Vertex object. A Vertex is a subclass of Point that can have
58
# some modeling attributes like colors or texture coordinates (we'll see them is further
59
# lessons) The first argument of the constructor is (again) the parent, and the three
60
# following one are the x, y and z coordinates.
61
62
# As 3D object, Point, Vector or Vertex have a parent too, though they are not
63
# considered as "children". The parent is used for automatic coordinates
64
# conversion, which will be detailed in a further lesson. Here, the coordinates
65
# are defined in the pyramid coordinate system.
66
67
# The order of the vertices in the list determines which side of the face is
68
# visible (for triangles, quads and polygons); you can get both side visible
69
# by setting the "double_sided" attribute to 1.
70
71
soya.Face(pyramid, [soya.Vertex(pyramid, 0.5, -0.5, 0.5),
72
soya.Vertex(pyramid, -0.5, -0.5, 0.5),
73
soya.Vertex(pyramid, -0.5, -0.5, -0.5),
74
soya.Vertex(pyramid, 0.5, -0.5, -0.5),
75
])
76
77
# Similarly, creates the 4 triangles.
78
# Here, we create different vertices ; you can also use the same vertex when 2 vertices
79
# have the same coordinates and attributes. Both yields the same final result (including
80
# in performance).
81
82
soya.Face(pyramid, [soya.Vertex(pyramid, -0.5, -0.5, 0.5),
83
soya.Vertex(pyramid, 0.5, -0.5, 0.5),
84
soya.Vertex(pyramid, 0.0, 0.5, 0.0),
85
])
86
87
soya.Face(pyramid, [soya.Vertex(pyramid, 0.5, -0.5, -0.5),
88
soya.Vertex(pyramid, -0.5, -0.5, -0.5),
89
soya.Vertex(pyramid, 0.0, 0.5, 0.0),
90
])
91
92
soya.Face(pyramid, [soya.Vertex(pyramid, 0.5, -0.5, 0.5),
93
soya.Vertex(pyramid, 0.5, -0.5, -0.5),
94
soya.Vertex(pyramid, 0.0, 0.5, 0.0),
95
])
96
97
soya.Face(pyramid, [soya.Vertex(pyramid, -0.5, -0.5, -0.5),
98
soya.Vertex(pyramid, -0.5, -0.5, 0.5),
99
soya.Vertex(pyramid, 0.0, 0.5, 0.0),
100
])
101
102
# Saves the pyramid.
103
# First we set the filename attribute, and then call the save method.
104
# Soya automatically saves it in directory soya.path[0] + "/worlds",
105
# and adds a ".data" extention.
106
107
pyramid.filename = "pyramid"
108
pyramid.save()
109
110
# Rotates the pyramid (for a better view)
111
112
# Notice that we have saved the pyramid BEFORE the rotation, since we don't want
113
# to save the rotation.
114
115
pyramid.rotate_lateral(60.0)
116
117
# Creates a light.
118
119
light = soya.Light(scene)
120
light.set_xyz(1.0, 0.7, 1.0)
121
122
# Creates a camera.
123
124
camera = soya.Camera(scene)
125
camera.set_xyz(0.0, -0.6, 2.0)
126
soya.set_root_widget(camera)
127
128
soya.Idler(scene).idle()
129
130