This file is indexed.

/usr/share/doc/python-soya-doc/examples/basic-3.py is in python-soya-doc 0.14-2.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  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
135
136
137
138
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- indent-tabs-mode: t -*-

# Soya 3D tutorial
# Copyright (C) 2004 Jean-Baptiste LAMY
#
# 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


# basic-3: Time management : a randomly moving sphere

# In this lesson, we'll create a spherish head that moves around randomly.
# You'll learn about time management (second part), vectors and coordinate-system
# conversion.


# Import the Soya module.

import sys, os, os.path, random, soya

soya.init()
soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))

# Creates a scene.

scene = soya.World()


# Creates the randomly moving sphere's class. We call it head, because we'll use
# a head-like model.
# This class inherits from soya.Body, so it can have a model (the head).
		
class Head(soya.Body):
	
	# Redefine the constructor.
	
	def __init__(self, parent):
		
		# Calls the soya.Body constructor (remember, calling the super implementation is
		# always a good idea), and use the model called 'caterpillar_head'.
		
		soya.Body.__init__(self, parent, soya.Model.get("caterpillar_head"))
		
		# Adds a speed attribute to our new object.
		# The speed is a Vector object. A Vector is a mathematical object, used for
		# computation ; contrary to other object (Light, Camera, Body, World,...) it does not
		# modify the rendering in any way.
		
		# A vector is defined by a coordinate system and 3 coordinates (X, Y, Z) ; here the
		# speed is defined in 'self', i.e. the Head, and with coordinates 0.0, 0.0, -0.2.
		# Remember that in Soya, the -Z direction is the front. So the speed
		# This means that the speed vector is parallel to the direction the head is looking
		# at, and has a length of 0.2.
		
		self.speed = soya.Vector(self, 0.0, 0.0, -0.2)
		
		# The current rotation speed (around Y axis)
		
		self.rotation_speed = 0.0
		
	# Like advance_time, begin_round is called by the main_loop.
	# But contrary to advance_time, begin_round is called regularly, at the beginning of each
	# round ; thus it receive no 'proportion' argument.
	# Decision process should occurs in begin_round.
		
	def begin_round(self):
		
		# Calls the super implementation.
		
		soya.Body.begin_round(self)
		
		# Computes the new rotation speed: a random angle between -25.0 and 25.0 degrees.
		
		self.rotation_speed = random.uniform(-25.0, 25.0)
		
		# The speed vector doesn't need to be recomputed, since it is expressed in the Head
		# CoordSyst.
		
	# In advance_time, we make the head advance.
	
	def advance_time(self, proportion):
		soya.Body.advance_time(self, proportion)
		
		# Performs the rotation, taking into account the proportion argument.
		
		self.rotate_y(proportion * self.rotation_speed)
		
		# Moves the head according to the speed vector.
		# add_mul_vector is identical to: self.add_vector(proportion * self.speed), but faster.
		
		# The speed vector and the Head are not in the same coordinate system, but Soya automatically
		# performs the needed conversion.
		
		self.add_mul_vector(proportion, self.speed)


# Creates a Head in the scene.

head = Head(scene)

# Creates a light.

light = soya.Light(scene)
light.set_xyz(2.0, 5.0, 0.0)

# Creates a camera.

camera = soya.Camera(scene)
soya.set_root_widget(camera)
camera.set_xyz(0.0, 15.0, 15.0)

# Makes the camera looking at the head's initial position.
# The look_at method is another rotation method ; it makes any 3D object looking toward
# the given position (a 3D object or a Point), or in the given direction (if the argument
# is a Vector).

camera.look_at(head)

#import time; main_loop = soya.MainLoop(scene)
#for i in range(3):
#	for j in range(5):
#		time.sleep(0.1); main_loop.update()
#	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] + "_%s.jpeg" % i))

soya.MainLoop(scene).main_loop()