# -*- 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# mouse-1: 3D mouse cursor# In this lesson, you'll learn how to display a 3D mouse cursor.# See the raypicking-2 tuto for more mouse-oriented tutorials.import sys, os,time,os.path, soya, soya.cube, soya.sdlconst, randomsoya.init()soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))# Creates the scene.scene = soya.World()class HotSpot(soya.CoordSyst): def __init__(self,parent,distance=1,function=None,angle=None): soya.CoordSyst.__init__(self,parent) #self.triggered = 0 self.distance = distance self.function = function #self.onceda = 0 self.angle = angle self.hit_time = 0 self.actors = [cube,bluecube,redcube,cube1,cube2,cube3] self._front_vector = soya.Vector(self,0,0,-1) self._tmp_vector = soya.Vector(self) print "Created a hotspot" def begin_round(self): distance = self.distance #print self.x,self.y,self.z if self.angle is None: #print "asfd" for actor in self.actors: #print "asfd1" if self.distance_to(actor) <= self.distance: print actor scene.remove(actor) #self.function(actor) else: print "asfd" tmp_vector = self._tmp_vector front_vector = self._front_vector angle = self.angle for actor in actors: if self.distance_to(actor) <= distance: tmp_vector.set_start_end(self,actor) if tmp_vector.angle_to(front_vector) <= angle: print "asdfgg" #self.function(actor) class Cursor(soya.Body): def __init__(self, parent, model = None): #self.world = soya.World() soya.Body.__init__(self, parent, model) #self.world.add(hotspot) hotspot.x = self.x hotspot.y = self.y hotspot.z = self.z self.speed = soya.Vector(self, 0.0, 0.0, -1.3) self.movea = 0 self.timer = 0 self.timeb = 0 def begin_round(self): soya.Body.begin_round(self) hotspot.x = self.x hotspot.y = self.y hotspot.z = self.z # Processes the events if self.movea == 1: self.timeb = time.time() #print "if ok" while self.timeb - self.timer > 0.5: #print "if ok" self.set_xyz(0,0,-0.2) self.movea =0 # print "timer" break self.add_mul_vector(1,self.speed) for event in soya.process_event(): if event[0] == soya.sdlconst.MOUSEBUTTONDOWN: self.timer = time.time() self.movea =1 if event[0] == soya.sdlconst.MOUSEMOTION: if self.movea == 0: self.mouse_pos = camera.coord2d_to_3d(event[1], event[2], self.z-4)# only 4 works...??? #print self.mouse_pos self.move(self.mouse_pos)green = soya.Material(); green.diffuse = (0.0, 0.0, 1.0, 1.0)red = soya.Material(); red.diffuse = (1.0, 0.0, 0.0, 1.0)blue = soya.Material(); blue.diffuse = (0.0, 1.0, 0.0, 1.0)cursorworld = soya.World(scene)yscene =soya.World()gcube = soya.cube.Cube(None, green).to_model()bcube = soya.cube.Cube(None, blue).to_model()rcube = soya.cube.Cube(None, red).to_model()bluecube = soya.Body(scene,bcube)redcube = soya.Body(scene,rcube)bluecube.z = -5.5bluecube.x = 1.5redcube.z = -5.5redcube.x = -1.5cubes = [gcube,bcube,rcube]cube = soya.Body(scene, cubes[random.randrange(0,3)])cube.x = random.randrange(-8,8)cube.y = random.randrange(-8,8)cube.z = -5cube1 = soya.Body(scene, cubes[random.randrange(0,3)])cube1.x = random.randrange(-8,8)cube1.y = random.randrange(-8,8)cube1.z = -5cube2 = soya.Body(scene, cubes[random.randrange(0,3)])cube2.x = random.randrange(-8,8)cube2.y = random.randrange(-8,8)cube2.z = -5cube3 = soya.Body(scene, cubes[random.randrange(0,3)])cube3.x = random.randrange(-8,8)cube3.y = random.randrange(-8,8)cube3.z = -5def hi(): print "hi"hotspot = HotSpot(scene,1)#block = soya.cube.Cube(None, green).to_model()a =Cursor(cursorworld, soya.cube.Cube(None, green).to_model())# Adds a light.light = soya.Light(scene)light.set_xyz(0.0, 0.2, 1.0)# Creates a camera.camera = soya.Camera(scene)camera.set_xyz(0.0, 0.0, 4.0)camera.fov = 100.0soya.set_root_widget(camera)# Main looptry: soya.MainLoop(scene).main_loop()except: 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"))