# -*- 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, random soya.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.5 bluecube.x = 1.5 redcube.z = -5.5 redcube.x = -1.5 cubes = [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 = -5 cube1 = soya.Body(scene, cubes[random.randrange(0,3)]) cube1.x = random.randrange(-8,8) cube1.y = random.randrange(-8,8) cube1.z = -5 cube2 = soya.Body(scene, cubes[random.randrange(0,3)]) cube2.x = random.randrange(-8,8) cube2.y = random.randrange(-8,8) cube2.z = -5 cube3 = soya.Body(scene, cubes[random.randrange(0,3)]) cube3.x = random.randrange(-8,8) cube3.y = random.randrange(-8,8) cube3.z = -5 def 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.0 soya.set_root_widget(camera) # Main loop try: 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"))