Thread: [cgkit-user] cgkit and Hydraulic cylinder model
Brought to you by:
mbaas
From: Myrek <my...@gm...> - 2008-06-26 15:29:56
|
Welcome. I wanted to use cgkit visualization work actuator. Do cgkit model can be done and the actuator piston, for example, without the use of "blender", 3DStudio MAX? For this you will need two cylinders with flat ends, and we have only cgkit cylinder with rounded peaks, the box crutches. How to create a cylinder, which will enter the second cylinder, and this move? Thanks Sorry for my English. |
From: Matthias B. <mat...@gm...> - 2008-06-26 21:40:04
|
Myrek wrote: > I wanted to use cgkit visualization work actuator. Do cgkit model can be > done and the actuator piston, for example, without the use of > "blender", 3DStudio MAX? For this you will need two cylinders with flat > ends, and we have only cgkit cylinder with rounded peaks, the box > crutches. How to create a cylinder, which will enter the second > cylinder, and this move? Do you mean you want to do a dynamics simulation? Or just a visualisation/animation of some mechanical parts? Depending on what exactly you want to do you could do both to some extent. For simulating objects dynamically you could use the Open Dynamics Engine (ODE) which can be used together with cgkit. For modeling the individual parts I would still recommend to use some 3D modeling package. You have mentioned Blender already, another free (and simpler) one is Wings 3D (http://www.wings3d.com/). You could use such a package to model the basic shape of your mechanical parts, export them as an OBJ file and import them into your Python program where you could animate them. (But if you are just after creating an animation and the animation is not mainly procedural, then it might actually be easier to do everything just in Blender). I hope this was of some help... - Matthias - |
From: Myrek <my...@gm...> - 2008-06-27 00:14:17
|
> Do you mean you want to do a dynamics simulation? Or just a > visualisation/animation of some mechanical parts? > Depending on what exactly you want to do you could do both to some > extent. For simulating objects dynamically you could use the Open > Dynamics Engine (ODE) which can be used together with cgkit. > For modeling the individual parts I would still recommend to use some 3D > modeling package. You have mentioned Blender already, another free (and > simpler) one is Wings 3D (http://www.wings3d.com/). You could use such a > package to model the basic shape of your mechanical parts, export them > as an OBJ file and import them into your Python program where you could > animate them. (But if you are just after creating an animation and the > animation is not mainly procedural, then it might actually be easier to > do everything just in Blender). > > I hope this was of some help... > > - Matthias - > Yes, I want to do a dynamics simulation. So I have to make a model in an external (different) programm, after I have to export it as obj file (*.obj) and I'll import it to my program which I have written in Python? I need to use cgkit + ODE to move him. In addition, hydraulic cylinder has to move after entering the proper tilt in the window written (or moving the slider) in Python (wxPython). Is this feasible? How do make interactive window in Python, which will appear in a scene? Should I use somehow the viewer.py? Or should I use something different? Later, I would like to steer this hydraulic cylinder with microcontroller connected to a computer via the RS-232 port Thank you very much for your response, much helped me. Myrek |
From: Matthias B. <mat...@gm...> - 2008-06-30 22:29:38
|
Myrek wrote: > Yes, I want to do a dynamics simulation. So I have to make a model in an > external (different) programm, after I have to export it as obj file (*.obj) > and I'll import it to my program which I have written in Python? Yes, if the existing geometric primitives are not adequate for your model then you need to create your own models (which are eventually turned into triangle meshes). But keep in mind that the geometry is actually only required for two things: determining mass properties and collision detection. And whenever possible you should avoid using triangle meshes for collision detection. The other primitives are faster and more stable. Depending on what you want to do you may even get away without any collision detection at all and just using appropriate joints to connect the parts together. > I need to use cgkit + ODE to move him. In addition, hydraulic cylinder has > to move after entering the proper tilt in the window written (or moving the > slider) in Python (wxPython). Is this feasible? If you want to use GUI elements (slider, buttons, etc.) you can write your own wxPython application that contains an OpenGL window and draw the cgkit scene into that window. > How do make interactive window in Python, which will appear in a scene? > Should I use somehow the viewer.py? Or should I use something different? The viewer tool is rather a simple visualization tool. It doesn't allow you to create GUI controls though. It can be extended to allow selecting 3D objects but for any other GUI stuff you need to write your own "viewer" tool. All you need is an OpenGL widget that can be used to draw the cgkit scene (have a look into the viewer tool to see how it draws the scene). > Later, I would like to steer this hydraulic cylinder with microcontroller > connected to a computer via the RS-232 port Of course, that leaves the scope of cgkit and you need an appropriate library to read those values. Maybe PySerial could be useful here (http://pyserial.sourceforge.net/). - Matthias - |
From: Myrek <my...@gm...> - 2008-07-09 21:47:30
|
Thank you for your reply. I've made the model in AutoCAD 2007 and I've export to obj file. Both facilities are independent, the scene looks like this: Root + --- GLDistantLight (GLTargetDistantLight / -) + --- GLDistantLight1 (GLTargetDistantLight / -) + --- Object1 (TriMesh / TriMeshGeom) + --- Object2 (TriMesh / TriMeshGeom) + --- TargetCamera (TargetCamera / -) Screenshot from the viewer tool is here: http://img90.imageshack.us/img90/6569/vieweram1.jpg Could you tell me how to combine(connect) two objects to move one object in the second one? I want to creating moving robot's arm like this. Bolt from one object is made to enter this into a hole of the second frame. Robot's arm has to move on this bolt. Does the network are available in other tutorials (other than the main party cgkit)? Myrek |
From: Matthias B. <mat...@gm...> - 2008-07-10 21:05:50
|
Myrek wrote: > I've made the model in AutoCAD 2007 and I've export to obj file. Both > facilities are independent, the scene looks like this: > Root > + --- GLDistantLight (GLTargetDistantLight / -) > + --- GLDistantLight1 (GLTargetDistantLight / -) > + --- Object1 (TriMesh / TriMeshGeom) > + --- Object2 (TriMesh / TriMeshGeom) > + --- TargetCamera (TargetCamera / -) > > Screenshot from the viewer tool is here: > http://img90.imageshack.us/img90/6569/vieweram1.jpg > > Could you tell me how to combine(connect) two objects to move one object in > the second one? You can obtain a reference to your object using the worldObject() function and then modify the pos/rot/scale or transform attributes: obj1 = worldObject("Object1") pos1 = (1,2,3) If you know the dimensions of your objects you can determine the positions/orientations you need to align them. But if possible, I would try to do that in your modeling package and already position the objects so that they have the desired initial position. > I want to creating moving robot's arm like this. > Bolt from one object is made to enter this into a hole of the second frame. > Robot's arm has to move on this bolt. I wouldn't rely on the geometry of the model and the trimesh collision to get this behavior. I doubt that you will get a stable simulation out of that (let alone a fast one). Instead you can connect them with a hinge joint and maybe even use other geometry for the simulation and use your models from Autocad only for the visualisation (you can parent them to the simulation objects and hide the simulation objects). Here is an example how you could set up an animation (play with the viewer tool): # Dynamics demo TargetCamera( pos = (0, -4, -0.5), target = (-0.25, 0, -0.5) ) obj1 = CCylinder( radius = 0.1, length = 0.75, pos = (0,0,0.5), rot = mat3.fromEulerXYZ(0, radians(90), 0), mass = 1.0, material = GLMaterial(diffuse=(1,0.5,0.5)) ) obj2 = CCylinder( radius = 0.1, length = 0.75, pos = (0.5,0,0), mass = 1.0, material = GLMaterial(diffuse=(0.5,1,0.5)) ) ODEHingeJoint( pos = (-0.5, 0, 0.5), rot = mat3.fromEulerXYZ(0, 0, radians(90)), body1 = obj1 ) ODEHingeJoint( pos = (0.5, 0, 0.5), rot = mat3.fromEulerXYZ(0, 0, radians(90)), body1 = obj1, body2 = obj2 ) ODEDynamics( auto_add = True ) > Does the network are available in other tutorials (other than the main party > cgkit)? What do you mean? If there are more tutorials on this? Sorry, I'm afraid there are no more, at least I'm not aware of someone having written a specific cgkit/ODE tutorial. - Matthias - |
From: Myrek <my...@gm...> - 2008-07-18 17:08:58
|
I do not know how to do that. I have the robot arm which moves up and down with hydraulic cylinder. Cylinder consists of two objects, the robot arm as well. Cylinder have to move the arm after some function give/transfer the value to this cylinder, e.g.: from 0 (inserted) to 100 (embossed cylinder). The cylinder marked as '1' (on the picture) is slips and comes inside cylinder number 2. Here is a picture: http://myrek.x.pl/cgkit/work.jpg model in obj: http://myrek.x.pl/cgkit/work.obj model in dwg: http://myrek.x.pl/cgkit/work.dwg file viewer: http://myrek.x.pl/cgkit/work.py Would it be possible to do something like this? This is just a piece of the robot. Thank you very much for your help Myrek |
From: Matthias B. <mat...@gm...> - 2008-07-21 22:24:28
|
Myrek wrote: > I do not know how to do that. > I have the robot arm which moves up and down with hydraulic cylinder. > Cylinder consists of two objects, the robot arm as well. Cylinder have to > move the arm after some function give/transfer the value to this cylinder, > e.g.: from 0 (inserted) to 100 (embossed cylinder). The cylinder marked as > '1' (on the picture) is slips and comes inside cylinder number 2. > > Here is a picture: http://myrek.x.pl/cgkit/work.jpg > model in obj: http://myrek.x.pl/cgkit/work.obj > model in dwg: http://myrek.x.pl/cgkit/work.dwg > file viewer: http://myrek.x.pl/cgkit/work.py > > Would it be possible to do something like this? This is just a piece of the > robot. I think you could set up the above example with only 1 body and 2 joints. Looking at your image it seems that the base of the robot is fixed and only the second segment can move. This means the first segment doesn't have to be simulated at all because its position is fixed anyway. So you need the second segment as a body and a hinge joint to connect it to the "world" (which has the same effect as connecting it to another fixed body). So far, this is pretty much the same what I posted last time, just remove the second object in my earlier example and you have just that. Now the cylinder that drives the arm could be represented by just a slider joint that is connected to the robot arm and the world (here I'm actually not quite sure if ODE needs a proper second body or not, but I think only having one body should be fine). You can set attributes "lostop" and "histop" on the slider to limit the range it can move. You can also activate a motor on the slider joint by setting the attributes "motorvel" and "motorfmax" attributes (also have a look at the ODE docs at www.ode.org). I'm not sure if you can actually set the position of the slider directly (probably not. This wouldn't be possible on a real motor as well), so you have to come up with a controller that controls the motor "force" depending on the desired position (which may be just as tricky as on a real robot). So I'd suggest you play around with the ODE stuff a bit. You can use the previous example as a starting point and then add/remove bodies, add joints, try to activate the motor (hinge joints also have motors) and so on. I would recommend to start with the built-in objects such as capped cylinders, boxes, spheres. As I said last time you only need the actual geometry for calculating mass properties (if necessary), for doing collision tests and for visualization. The actual simulation part doesn't need the geometry. And looking at your screenshot it looks to me as if you could get away with using the actual geometry for visualisation *only* and use the simpler primitives for the simulation. And keep in mind that ODE is sort of a game physics engine that is more concerned with doing fast simulations than accurate ones. - Matthias - |
From: Myrek <my...@gm...> - 2008-07-30 12:30:56
|
Very thanks. I have a question about the connection of objects (parent). The built-in objects such as BOXES I can connect them with: model2 (... parent = model1, ...) and is ok But during the merger of imported models are not working. Example: load ( "cylinder.stl") model1 = worldObject ( "AutoCAD solid") load ( "tlok.stl") model2 = worldObject ( "AutoCAD solid1") load ( "ramie.stl") model3 = worldObject ( "AutoCAD solid2") model3.auto_insert = True model3.parent = model1 After that I have an error: Traceback (most recent call last): File "<pyshell#24>", line 1, in <module> model3.parent = model2 File D: \ Python25 \ Lib \ site-packages \ cgkit \ worldobject.py ", line 157, in __setattr__ _core.WorldObject.__setattr__ (self, name, val) AttributeError: can not set attribute I can not set attribute parent (model3.parent = model1). Why? |
From: Matthias B. <mat...@gm...> - 2008-07-30 20:23:04
|
Myrek wrote: > I have a question about the connection of objects (parent). The built-in > objects such as BOXES I can connect them with: model2 (... parent = model1, > ...) and is ok > But during the merger of imported models are not working. Example: > > load ( "cylinder.stl") > model1 = worldObject ( "AutoCAD solid") > load ( "tlok.stl") > model2 = worldObject ( "AutoCAD solid1") > load ( "ramie.stl") > model3 = worldObject ( "AutoCAD solid2") > > model3.auto_insert = True This line has no effect. The auto_insert parameter is only meaningful as an argument to the object constructors, but as you have loaded the models from a file they are already part of the scene. So the above line just adds a bool attribute "auto_insert" to the model but the variable is never used. > model3.parent = model1 > > After that I have an error: > > Traceback (most recent call last): > File "<pyshell#24>", line 1, in <module> > model3.parent = model2 > File D: \ Python25 \ Lib \ site-packages \ cgkit \ worldobject.py ", > line 157, in __setattr__ > _core.WorldObject.__setattr__ (self, name, val) > AttributeError: can not set attribute > > I can not set attribute parent (model3.parent = model1). Why? The "parent" property is just a read-only property. It's mentioned here: http://cgkit.sourceforge.net/doc2/node125.html (but I agree that it's probably not the most intuitive thing to find this information). Changing the parent can be done using the link() function which is defined in the cmds module (if you are using the viewer or render tool you don't have to import anything). The function is documented on this page: http://cgkit.sourceforge.net/doc2/commands.html (somewhere in the middle). So to connect model3 to model1 you would use the following call: link(model3, model1) - Matthias - |
From: Myrek <my...@gm...> - 2008-07-31 09:28:28
|
Thank you, its worked now. I have a question. How do the make axis which will be rotate object? I want to rotate the arm in the base of the axis of bending joint. How to apply: load("razem_2_ramiona.obj") base= worldObject("Object2") arm = worldObject("Object1") arm.rot = mat3.fromEulerXYZ(0, radians(-90), 0) This arm turned around the initial position (pos), and I want to create an axis of rotation in another place (on joint base and arm) and there it rotate. Would it be done? Maybe through the slot? Sorry for my english :) Thx. |
From: Matthias B. <mat...@gm...> - 2008-07-31 19:32:26
|
Myrek wrote: > How do the make axis which will be rotate object? I want to rotate the arm > in the base of the axis of bending joint. How to apply: > > load("razem_2_ramiona.obj") > base= worldObject("Object2") > arm = worldObject("Object1") > > arm.rot = mat3.fromEulerXYZ(0, radians(-90), 0) > > > This arm turned around the initial position (pos), and I want to create an > axis of rotation in another place (on joint base and arm) and there it > rotate. Would it be done? Maybe through the slot? You can set a new pivot point which is the center of the rotation: arm.pivot = (0, 0, 1) This sets the positional part of the offset transformation (see http://cgkit.sourceforge.net/doc2/node8.html). - Matthias - |
From: Myrek <my...@gm...> - 2008-08-02 13:10:48
|
Welcome. I managed to do what I wanted,but I need only improve a few things. Animated robot is here: http://www.youtube.com/watch?v=alA7aMU5nj0 Arms are good rotates, actuators come good as well. Now I have to put the scene into my program. I wrote a simple application under wxPython and has made OpenGL scene. I can draw elements OpenGL, but I don't know how to put any items from cgkit. Viewer.py is no good for this, because there are elements of pyGame (SDL), and a scene from pyGame can't be placed in an application (which can be as separate window but I have to heve this in the application). So I decided to take advantage of pure OpenGL. I have such a class, which draws on elements of the stage OpengGL: def OnDraw(self): # clear color and depth buffers glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # draw six faces of a cube glBegin(GL_QUADS) # Start drawing a 4 sided polygon glVertex3f(-1.0, 1.0, 0.0) # Top Left glVertex3f(1.0, 1.0, 0.0) # Top Right glVertex3f(1.0, -1.0, 0.0) # Bottom Right glVertex3f(-1.0, -1.0, 0.0) # Bottom Left glEnd() #scene = getScene() #scene.setGlobal("stereo", self.options.stereo) #scene.setGlobal("polygonmode", self.options.polygon_mode) #scene.setGlobal("navigationmode", self.options.navigation_mode) Sphere(name = "My Sphere", radius = 1.0, material = GLMaterial(diffuse = (0.7, 1, 0.7))) # rotate the scene etc if self.size is None: self.size = self.GetClientSize() w, h = self.size w = max(w, 1.0) h = max(h, 1.0) xScale = 180.0 / w yScale = 180.0 / h glRotatef((self.y - self.lasty) * yScale, 1.0, 0.0, 0.0); glRotatef((self.x - self.lastx) * xScale, 0.0, 1.0, 0.0); self.SwapBuffers() I can draw elements from OpenGL, but I can't draw an element from cgkit. Does anyone know how to do this? The entire program is here: http://myrek.x.pl/cgkit/xxx.py (you need: wxPython , pyOpenGL, cgkit) Thx. |
From: Matthias B. <mat...@gm...> - 2008-08-03 09:54:37
|
Myrek wrote: > I managed to do what I wanted,but I need only improve a few things. Animated > robot is here: http://www.youtube.com/watch?v=alA7aMU5nj0 > Arms are good rotates, actuators come good as well. > > Now I have to put the scene into my program. I wrote a simple application > under wxPython and has made OpenGL scene. I can draw elements OpenGL, but I > don't know how to put any items from cgkit. There is an undocumented class GLRenderInstance which you can access via the cgkit.all module. This class can draw a cgkit scene using OpenGL. It assumes an OpenGL context is already available and just issues appropriate OpenGL commands. So this is what you can use in your OnDraw() method. Have a look at viewer.py and its draw() method. This method is the equivalent of your OnDraw() method. Basically, you set the desired parameters on the renderer that determine how the scene will be drawn as, then you also set the projection and viewing matrix (which you can obtain from the camera object) and finally you call the paint() method with the root object that you want to draw. The other thing you need to do when you have your own application is to call the step() method every frame on the cgkit timer object (see the action() method in viewer.py), otherwise time will stand still and you will only see a static scene. - Matthias - |
From: Myrek <my...@gm...> - 2008-08-06 11:53:04
|
Matthias wrote: > There is an undocumented class GLRenderInstance which you can access via > the cgkit.all module. This class can draw a cgkit scene using OpenGL. It > assumes an OpenGL context is already available and just issues > appropriate OpenGL commands. So this is what you can use in your > OnDraw() method. > Have a look at viewer.py and its draw() method. This method is the > equivalent of your OnDraw() method. Basically, you set the desired > parameters on the renderer that determine how the scene will be drawn > as, then you also set the projection and viewing matrix (which you can > obtain from the camera object) and finally you call the paint() method > with the root object that you want to draw. > > The other thing you need to do when you have your own application is to > call the step() method every frame on the cgkit timer object (see the > action() method in viewer.py), otherwise time will stand still and you > will only see a static scene. > > - Matthias - Welcome. I can't in any way to cope with displaying scenes from cgkit window in wx.Python frame :( Could you help me write a piece of code? Certainly it would have another useful. I wants in a simple window with the menu to view a scene from cgkit. The window is of such a code: import wx import sys from wx import glcanvas from OpenGL.GL import * from OpenGL.GLUT import * from cgkit.all import * class MyCanvasBase(glcanvas.GLCanvas): def __init__(self, parent): glcanvas.GLCanvas.__init__(self, parent, -1) self.init = False # initial mouse position self.lastx = self.x = 30 self.lasty = self.y = 30 self.size = None self.Bind(wx.EVT_PAINT, self.OnPaint) def OnPaint(self, event): dc = wx.PaintDC(self) self.SetCurrent() if not self.init: self.InitGL() self.init = True self.OnDraw() class cgkitScene(MyCanvasBase): def InitGL(self): # set viewing projection glMatrixMode(GL_PROJECTION) glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0) def OnDraw(self): self.renderer = GLRenderInstance() scene = getScene() renderer = self.renderer # Draw scene root = scene.worldRoot() renderer.paint(root) TargetCamera( pos = (3,2,2), target = (0,0,0) ) GLPointLight( pos = (3, -1, 2), diffuse = (1, 0.7, 0.2) ) GLPointLight( pos = (-5, 3, 0), diffuse = (0.2, 0.2, 0.5), intensity = 3.0 ) Sphere( name = "My Sphere", radius = 1.0, material = GLMaterial( diffuse = (0.7, 1, 0.7) ) ) self.SwapBuffers() class MainWindow(wx.Frame): def __init__(self, parent = None, id = -1, title = "Small Editor"): # Init wx.Frame.__init__( self, parent, id, title, size = (600,600), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE ) ############################################ self.control = cgkitScene(self) ############################################ # StatusBar self.CreateStatusBar() # Filemenu filemenu = wx.Menu() # Filemenu - About menuitem = filemenu.Append(-1, "&About", "Information about this program") self.Bind(wx.EVT_MENU, self.OnAbout, menuitem) # here comes the event-handler # Filemenu - Separator filemenu.AppendSeparator() # Filemenu - Exit menuitem = filemenu.Append(-1, "E&xit", "Terminate the program") self.Bind(wx.EVT_MENU, self.OnExit, menuitem) # here comes the event-handler # Menubar menubar = wx.MenuBar() menubar.Append(filemenu,"&File") self.SetMenuBar(menubar) # Show self.Show(True) def OnAbout(self,event): message = "A sample editor\n in wxPython" caption = "About Sample Editor" wx.MessageBox(message, caption, wx.OK) def OnExit(self,event): self.Close(True) # Close the frame. app = wx.PySimpleApp() frame = MainWindow() app.MainLoop() # destroying the objects, so that this script works more than once in IDLEdieses Beispiel del frame del app The window displays only the scene without objects. I know that there is not enough code, but hard to me to "rewrite" something from viewer.py, for I am only novice developer. Tray but I can't understand this. In addition, I have to finish in 2 weeks:( I need this to my thesis at the University. Sorry for my english. Myrek |
From: Matthias B. <mat...@gm...> - 2008-08-06 20:17:57
Attachments:
customviewer.py
|
Myrek wrote: > I can't in any way to cope with displaying scenes from cgkit window in > wx.Python frame :( Could you help me write a piece of code? Certainly it > would have another useful. I wants in a simple window with the menu to view > a scene from cgkit. The window is of such a code: > [...] Firstly, you may have noticed that you actually saw the background colour and the little coordinate axis in the lower left, so you were not that much off and the renderer actually did draw something. But here are some points that were wrong: - You were creating the scene inside OnDraw() (even *after* calling paint()), so whenever the window was refreshed you were creating more and more objects. You should instead create the scene only once outside the OnDraw() method. - You didn't set any renderer parameters, in particular the projection matrix and view transformation was missing. The renderer doesn't pick a camera itself from the scene, you have to provide this information yourself. So you have to grab the camera object and use its methods to compute those matrices. - Your InitGL() method is not necessary. The renderer will set the view transformation anyway. - What was the reason for the separation of MyCanvasBase and cgkitScene? If cgkitScene should really just create the scene, then there is need to derive it from MyCanvasBase and implement its OnDraw() method there. I have attached a modified version of your program to this mail where you can see the sphere displayed in your viewing area. - Matthias - |
From: Myrek <my...@gm...> - 2008-08-07 23:19:02
|
Matthias wrote: >-- What was the reason for the separation of MyCanvasBase and cgkitScene? >If cgkitScene should really just create the scene, then there is need to >MyCanvasBase derive from it and implement its OnDraw () method there. Thank you very much for the code. I do not know why separate this functions, I tried various methods and doesn't work. Now, I wanted to do animation scene as is the viewer.py (action ()), but I do not know how. I think that it will be to do so in a simple manner. Can you improve the code for that feature? If you can, please write a sample function, for example, that will change the object position in the Scene (sphere change position with standard pos = (0,0,0) for another position). Then I knew how to control objects on the Scene in the my program(on the push button in the wx.Python frames). In my program I have 2 frames: on 1 frame is the button, on 2 frame is scene of cgkit). Thank you very much for the time and assistance. Myrek |
From: Matthias B. <mat...@gm...> - 2008-08-09 11:50:55
|
Myrek wrote: > Now, I wanted to do animation scene as is the viewer.py (action ()), but I > do not know how. I think that it will be to do so in a simple manner. Can > you improve the code for that feature? As you are using your own viewer application, you need to advance time on a regular basis, otherwise the scene will be static. You do that by calling the step() method on the timer object: timer = getScene().timer() timer.step() This advances time by one "frame" (you can set the time step or frame rate on the timer object). To run the animation smoothly, you have to call this method in regular time intervals (which ideally should match the time step set on the timer). Now how you do that is up to you. The cgkit viewer tool uses the pygame clock. wx has timer objects, so have a look at the wx documentation how to create regular timer events. Once time is running, you can animate your objects just as you would do using the cgkit viewer or render tool. Have a look at the "Animation" tutorial on this page: http://cgkit.sourceforge.net/tutorials/ (also have a look at the 3rd code example) - Matthias - |