Jump to content
  • Advertisement


  • Content Count

  • Joined

  • Last visited

Community Reputation

100 Neutral

About Lethe

  • Rank
  1. Almost off topic, but just in case have you considered panda 3d (panda3d.org)? Its a complete game engine with everything already integrated, which saves you some work - its almost always python driven (Though can be developed for with c++.), and has every feature you listed, and a few more. Its bsd license and has been used by Disney for a couple of mmorpg's, is actively developed plus it has a pretty good manual. Now it doesn't have the demos that Ogre does graphically (Disney target low end hardware.) but everything Ogre can do it can, just not always as easily, though for typical stuff it will generate the shaders for you. Another noticeable weakness is the built in gui lacks convenience, but there is a wrapper that makes it far more usable which you can find in the forums. Its particle engine sucks, so most people write their own when they need one. No Bullet I'm afraid - it has ode instead plus its own bullet style physics engine, which is nowhere near as good. There is also PhysX support, but there are license issues with that and its Windows only. Be aware that 1.7.0 should be out soon (About a month - its just bugs now - I'ld go straight to a test build and skip 1.6.2 entirely.) and has a lot of new stuff, including a web plugin and packaging system to allow panda games to be distributed like flash games, it also adds the regularly requested automatic shadow support and a lot of other shine. But I'ld go have a look - will only take 10 minutes to have a quick flip through the manual and you might like what you see. (Disclaimer: I maintain the pipeline from Blender 3D to Panda, so my opinion here is hardly unbiased;-) )
  2. Lethe

    3D Game Engine (Python or C/C++)

    Just to say - this speed concern with Panda 3D is unfounded. You interface with the engine using Python (Though you can also use c++) but the engine itself, i.e. all the stuff that matters, is in c++, and as fast as you need it. I would strongly recommend it - as people have said, its a complete game engine, not a 3D rendering system like Ogre et. al. It also has decent documentation, which is a major weakness of some of the others. As for the OSX support, the next release (1.6.0) will officially support that, so you won't even have to compile it yourself, and should be out within the month. I am of course biased however, seeing as a I maintain the Blender/Panda model converter. It also has the advantage of fast development however - a few weekends ago I got a basic FPS working in a single weekend, and most of that was modeling a test level... go figure.
  3. Lethe

    Games companies in the UK

    There are loads of games companies in the UK. For one thing EA's headquarters are in Guildford, and a lot of stuff goes on there. There is also Lionhead in Guildford - i.e. Peter Molonex's company. Then there is Rockstar North in Edinburgh - they make GTA, and Rockstar Leeds, which do the PSP version of GTA. There is also the people who did Darwinia in Cambridge. I'm sure there are loads more - game making is pretty big here, but that is just off the top of my head - as always, just apply Google... As for if any would take on an IT, I don't know - they can pick and choose from graduates after all, not sure what would be in it for them to have an IT around. But good luck with it!
  4. Lethe

    Philosophy In Games

    Philosophy when labeled as such is often a turn off. But most things involve applied philosophy in some way, shape or form - people may not realise it but there doing it all the time. Just think of nearly every political discussion that doesn't involve the tie colour of the candidates. Even a simple morality story is a (usually very simple) example. So yeah, its easy to put at least some in. Saying that deep and complex thoughts are probably hard to get in. And if you can think of a way of getting continental philosophy into a game without getting a wtf your one better than me... Deus Ex comes to mind as exploring some complex ideas (Transhumanism mainly.), at least at a surface level. Many games explore, albit accidentally, the consequences of extreme power. And Bioshock? The whole thing is an exploration of Ayn Rand's objectivism and how it goes horribly wrong when confronted with actual human behaviour. Planescape Torment I also hear has some deep dialog, though never played it. I'll admit there a drop in the ocean, and there is probably far less of it than you find in books and movies by ratio, but that is two blockbusters, so its quite doable...
  5. Lethe

    python for games?

    I wouldn't say its not ideal - it is in fact one of the better choices available, especially for beginners. But go look at pygame.org for 2D stuff or panda3d.org for 3D stuff - they do all the heavy lifting letting you worry about actual game stuff.
  6. Lethe

    Blender vs traditional commercial solutions

    In regards to the key customisation thing that esrix mentioned they are working on that for version 2.5 of Blender, though I wouldn't expect that till sometime in 2009. I have also used all 3 programs, but never got on with Max, was a Maya user for a while and finally settled on Blender, which I prefer. It is just a matter of preference though - once you have learnt a program most people don't bother to learn another, and this is what gives Max/Maya the edge, as zer0wolf said. The one thing I would say is that for making low resolution models Blender has recently gained some really useful features - primarily the baking of normal maps, displacement maps and texture maps from a complex model onto a simpler model - this is key to making really good 3D models for a game. Its armature system is also really nice, as is its UV handling, so for game developers I think its a decent choice. If you want an example of it being used in a computer game go look at the apricot project - http://www.yofrankie.org/ - a blender foundation project to use it for just that.
  7. In regarding fmod, Panda 3D now supports OpenAL, though that is still a little flaky right now, but getting better. Additionally, from a licensing perspective the cvs server had all the header licenses changed to BSD a number of days ago, though no announcement or pre-compiled release has yet been made. But any day now Panda will be properly open source rather than almost open source as it has been for some time. Physics is still an issue, though you can integrate PyODE easily enough and the source code to do that is available in the forums. Its also the case that the proper integration work has actually been done at this point, just not enabled in the build system whilst the last bugs are ironed out. So, again, any day now it should have good physics. But yeah, I would back the Panda 3D recommendation - been using it myself and development is really fast. Plus it has loads of things just built in and ready to use - per pixel lighting is just a single function call to enable for instance. Plus the integration with Blender (An open source 3d modelling program.) is really good, so exporting 3D stuff into it is relatively painless.
  8. Just to point out that calculating the eigenvalues and vectors of a symmetric matrix and calculating the SVD of a symmetric matrix are identical, you just get the eigenvectors back twice with SVD. The difference is however that you can find code that is optimised to the symmetric case, but all SVD implementations will make no such assumption and hence be less efficient, so if speed matters get a symmetric implementation that returns eigenvectors as well as eigenvalues. If speed doesn't matter then whatever of course - depends on how often you want to do it. I've copy and pasted mine in below, its in c++ and uses templates however, so its a touch hairy. Because of that I suspect you'll find some easier code to use, and I wouldn't blame you, but just incase:-) /// This calculates the eigenvalues and eigenvectors of a symmetric square /// matrix. No complex numbers involved in this case. /// The relation q^T a q = d will hold. /// \param a The input symmetric matrix, will be trashed. /// \param q Output rotation matrix, the eigenvectors. nxn /// \param d Output diagonal matrix, as a vector - the eigenvalues. Length n. /// \returns true on success, false on failure. template <typename M,typename V> inline bit SymEigen(M & a,M & q,V & d) { LogTime("eos::math::SymEigen"); log::Assert((a.Rows()==a.Cols())&&(a.Rows()==q.Rows())&&(q.Rows()==q.Cols())&&(a.Rows()==d.Size())); // First perform a householder tri-diagonalisation, makes the following QR // iterations better... for (nat32 k=0;k<a.Rows()-2;k++) { // Calculate householder vector, store it in the subdiagonal... // (Replacing first value of v (Which is always 1) with beta.) // (For off diagonal symmetric entrys only fill in super-diagonal.) typename M::type sigma = static_cast<typename M::type>(0); typename M::type x0 = a[k+1][k]; for (nat32 r=k+2;r<a.Rows();r++) sigma += math::Sqr(a[r][k]); if (math::IsZero(sigma)) a[k+1][k] = 0.0; else { typename M::type mu = math::Sqrt(math::Sqr(a[k+1][k]) + sigma); if (a[k+1][k]<=static_cast<typename M::type>(0)) a[k+1][k] = a[k+1][k] - mu; else a[k+1][k] = -sigma/(a[k+1][k] + mu); for (nat32 r=k+2;r<a.Rows();r++) a[r][k] /= a[k+1][k]; a[k+1][k] = static_cast<typename M::type>(2) * math::Sqr(a[k+1][k])/(sigma + math::Sqr(a[k+1][k])); } // Set the symmetric entry, needs info from above... a[k][k+1] = math::Sqrt(sigma + math::Sqr(x0)); // Update the matrix with the householder transform (Make use of symmetry)... // Calculate p/beta, store in d... for (nat32 c=k+1;c<a.Cols();c++) { d[c] = a[c][k+1]; // First entry of v is 1. for (nat32 r=k+2;r<a.Rows();r++) d[c] += a[r][k] * a[c][r]; } // Calculate w, replace p with it in d... typename M::type mult = d[k+1]; for (nat32 r=k+2;r<a.Rows();r++) mult += a[r][k] * d[r]; mult *= math::Sqr(a[k+1][k]) / static_cast<typename M::type>(2); d[k+1] = a[k+1][k] * d[k+1] - mult; for (nat32 c=k+2;c<a.Cols();c++) d[c] = a[k+1][k] * d[c] - mult * a[c][k]; // Apply the update - make use of symmetry by only calculating the lower // triangular set... // First column where first entry of v being 1 matters... a[k+1][k+1] -= static_cast<typename M::type>(2) * d[k+1]; for (nat32 r=k+2;r<a.Rows();r++) a[r][k+1] -= a[r][k] * d[k+1] + d[r]; // Remainning columns... for (nat32 c=k+2;c<a.Cols();c++) { for (nat32 r=c;r<a.Rows();r++) { a[r][c] -= a[r][k] * d[c] + a[c][k] * d[r]; } } // Do the mirroring... for (nat32 r=k+1;r<a.Rows();r++) { for (nat32 c=r+1;c<a.Cols();c++) a[r][c] = a[c][r]; } } // Use the stored sub-diagonal house-holder vectors to initialise q... math::Identity(q); for (int32 k=int32(a.Cols())-3;k>=0;k--) { // Arrange for v to start with 1 - avoids special cases... typename M::type beta = a[k+1][k]; a[k+1][k] = static_cast<typename M::type>(1); // Update q, column by column... for (nat32 c=nat32(k)+1;c<q.Cols();c++) { // Copy column to tempory storage... for (nat32 r=nat32(k)+1;r<q.Rows();r++) d[r] = q[r][c]; // Update each row in column... for (nat32 r=nat32(k)+1;r<q.Rows();r++) { typename M::type mult = beta * a[r][k]; for (nat32 i=nat32(k+1);i<q.Cols();i++) q[r][c] -= mult * a[k] * d; } } } // Now perform QR iterations till we have a diagonalised - at which point it // will be the eigenvalues... (Update q as we go.) // These parameters decide how many iterations are required... static const typename M::type epsilon = static_cast<typename M::type>(1e-6); static const nat32 max_iters = 64; // Maximum iters per value pair. nat32 iters = 0; // Number of iterations done on current value pair. bit all_good = true; // Return value -set ot false if iters ever reaches max_iters. // Range of sub-matrix being processed - start is inclusive, end exclusive. int32 start = a.Rows(); // Set to force recalculate. int32 end = a.Rows(); // (Remember that below code ignores the sub-diagonal, as its a mirror of the super diagonal.) while (true) { // Move end up as far as possible, finish if done... int32 pend = end; while (true) { int32 em1 = end-1; int32 em2 = end-2; typename M::type tol = epsilon*(math::Abs(a[em2][em2]) + math::Abs(a[em1][em1])); if (math::Abs(a[em2][em1])<tol) { end -= 1; if (end<2) break; } else break; } if (pend==end) { iters += 1; if (iters==max_iters) { all_good = false; if (end==2) break; iters = 0; end -= 1; continue; } } else { if (end<2) break; iters = 0; } // If end has caught up with start recalculate it... if ((start+2)>end) { start = end-2; while (start>0) { int32 sm1 = start-1; typename M::type tol = epsilon*(math::Abs(a[sm1][sm1]) + math::Abs(a[start][start])); if (math::Abs(a[sm1][start])>=tol) start -= 1; else break; } } // Do the QR step, with lots of juicy optimisation... // Calculate eigenvalue of trailing 2x2 matrix... int32 em1 = end-1; int32 em2 = end-2; typename M::type temp = (a[em2][em2] - a[em1][em1]) / static_cast<typename M::type>(2); typename M::type div = temp + math::Sign(temp) * math::Sqrt(math::Sqr(temp) + math::Sqr(a[em2][em1])); typename M::type tev = a[em1][em1] - math::Sqr(a[em2][em1])/div; // Calculate and apply relevant sequence of givens transforms to // flow the numbers down the super/sub-diagonals... typename M::type x = a[start][start] - tev; typename M::type z = a[start][start+1]; for (int32 k=start;;k++) { // Calculate givens transform... typename M::type gc = static_cast<typename M::type>(1); typename M::type gs = static_cast<typename M::type>(0); if (!math::IsZero(z)) { if (math::Abs(z)>math::Abs(x)) { typename M::type r = -x/z; gs = static_cast<typename M::type>(1)/math::Sqrt(static_cast<typename M::type>(1)+math::Sqr(r)); gc = gs * r; } else { typename M::type r = -z/x; gc = static_cast<typename M::type>(1)/math::Sqrt(static_cast<typename M::type>(1)+math::Sqr(r)); gs = gc * r; } } typename M::type gcc = math::Sqr(gc); typename M::type gss = math::Sqr(gs); // Update matrix q (Post multiply)... for (nat32 r=0;r<q.Rows();r++) { typename M::type ck = q[r][k]; typename M::type ck1 = q[r][k+1]; q[r][k] = gc*ck - gs*ck1; q[r][k+1] = gs*ck + gc*ck1; } // Update matrix a... // Conditional on not being at start of range... if (k!=start) a[k-1][k] = gc*x - gs*z; // Non-conditional... { typename M::type e = a[k][k]; typename M::type f = a[k+1][k+1]; typename M::type i = a[k][k+1]; a[k][k] = gcc*e + gss*f - static_cast<typename M::type>(2)*gc*gs*i; a[k+1][k+1] = gss*e + gcc*f + static_cast<typename M::type>(2)*gc*gs*i; a[k][k+1] = gc*gs*(e-f) + (gcc - gss)*i; x = a[k][k+1]; } // Conditional on not being at end of range... if (k!=end-2) { z = -gs*a[k+1][k+2]; // a[k][k+2] a[k+1][k+2] *= gc; } else break; } } // Fill in the diagonal... for (nat32 i=0;i<d.Size();i++) d = a; return all_good; }
  9. Lethe

    Mesh simplification algorithms

    I use an algorithm from the paper 'Surface Simplification Using Quadric Error Metrics' by M Garland and P Heckbert myself. Its one example of an edge collapse algorithm, which most mesh simplification algorithms are. In my experience its extremely good, though if your using it for games you will need to run it in advance. Its quite easy to implement if you have the code for a good mesh data structure, matrix inversion and a priority queue available. Anyway, you can get the various version of the paper from http://graphics.cs.uiuc.edu/~garland/research/quadrics.html and a piece of software with sourcecode available for download from http://graphics.cs.uiuc.edu/~garland/software/qslim.html. Not sure what license is on that programs code though, and you would have to separate it from the gui etc. One quick note though, you can not use mesh simplification algorithms to generate collision meshes as there will be parts in the original mesh that exit the bounds of the simplified mesh, which is usually not the desired affect. There are presumably algorithms designed with this in mind, but I have no idea of any specific one.
  10. I'm asking for trouble saying this, but hey, what the hell, I think its reasonable... Java has nothing unique of value, I have never found a problem where Java would be my language of choice - every feature is done better in lots of other languages, and often such that the other languages are better at solving a whole class of problems. However, lots of people can code in it, and its taught extensively. So when you bring a team of code monkeys together with different skills its often the lowest common denominator, and is therefore used to avoid the effort of learning a better language for the job, as its simply good enough. Its a corporate language in other words, not an engineers language. So its best feature is that it will earn you a salary in many, many places.
  11. Lethe


    Passing down basic stats would help but it would still be tedious unless all stats, or all stats that take significant time to acquire, are passed down. However, if you imagine a futuristic game where 'level ups' involve genetic modification it would all make sense, except the kid would only have the stats when you had sex. This would make sex a kind of saved game system, which seeing as I play most games for half hour bursts could necessitate a really horny character... ;-) (Alternatively for fantasy you could work in a magical amulet etc, and its the amulet rather than the person that upgrades - whoever wears it (Your descendent.) gets the power. That is not why I wrote this post though.)
  12. I've been in a similar position of late. One link you might find interesting is http://tenminutedrawing.blogspot.com/ - it won't get you that far, but its on-line and free so you can't complain. Gave me a kick start at any rate - looking for a book myself now. (Will look at the above suggestions.) As for Blender, I'm one of those that has learnt it (...) - it isn't as hard as everybody says. Just keep going at the tutorials, keep the manual open in your web-browser and eventually it will snap. Its work flow is brilliant once you get it, just got to climb that hill first. Its just a little steeper than the others, but the vista at the top is just as satisfying:-)
  13. Lethe

    What OS should I learn C++ on?

    Just to join this gestating flamewar... Whilst I agree that Linux is lacking in the IDE department (Though eclipse, if you can tolerate its memory consumption and general slugishness is a very good ide. I just stick to gedit and hand crafted makefiles myself, but I'm a control freak.) there is one area in my experiance where Linux has Windows on its knees and that is debugging. Basicaly between gcc and valgrind you have a perfect tool set in that regard, ok its command line, but thats faster for debugging work in my experiance. And they just do things that, as far as I know, are not avaliable on windows. Certainly not avaliable for free/in m$'s basic tool set. Things like, at a breakpoint, editing the program state, by executing arbitary expressions, including calling entire program function/methods which then go on to run until they return/another bug is found. And I am yet to see a memory bug that Valgrind doesn't catch. Of course, not sure thats relevant to a beginer. But then, this entire thread hasn't been beginner relevant for a few posts now:-) Windows might be the better choice for a beginer, because a bit of hand holding helps. Its also probably better for a large chunk of the corporate world, where throwing money at a problem to get it solved quicker with cheaper programmers makes sense. But for pure control freak hackery nothing beats Linux:-) Sorry for any oxygen/logs I have just added.
  14. Lethe

    high resolution scan of a 3D face

    I would disagree with WorldPlanter's statement - to make a really good 3d model of a head takes days, and artists arn't cheap. You don't need that many heads in your project before its cheaper to buy an entire head scanner rather than pay for the artists, there workstations and office space. You could also rent one. I have one at my uni - a Cyberware Head & Face Colour Scanner, tis great fun to play with and as you may expect, I have such a model of my own head. People might look a bit strange if I asked permission to give out 3d models of there heads for free on the internet though. And you really don't want to look too closely at my head;-) Anyway, if you goto http://www.cyberware.com/products/index.html they have sample files that you can download. There are several formats suplied but I would go for the compressed .ply files - thats there primary format, and blender 3d will open them once you have run gzip over them. Have fun!
  15. ToohrVyk is right - if you can't read and understand the relevent research papers on the subject you don't stand a chance of getting even a half-decent implimentation. But I just wanted to expand on the practicality of this. Web cameras are not universally avaliable, and having multiple schemes that let the user choose depending on there capability just allows the crackers to attack the weakest scheme. So you either restrict your market or produce a scheme with more potential flaws - a lose-lose situation. ToohrVyk is again slap on the money when he sugests an image of Bruce Willis - not only could you use an image, the cracker could write a fake webcam driver that allways outputs an image of your selected celebrity. This scheme is in fact easier to crack than the ushall schemes. Biometrics only work in combination with other security systems - ushally it has to be a security guard making sure you don't game the system. A good example of this is fingerprints with laptops/pdas - instead of the password on a stickynote on the monitor its liberally splattered all over the case of the device in question. It just takes a little more technology to extract than ushall, but certainly nothing you can't buy in your local shops. People buy such devices because it sounds cool. At the end of the day, theres a very reliable scheme avaliable - online verification with encrypted executables, as used by Steam for example. This requires nothing as annoying as fidling with a webcam by the user and is as good at verification as any other scheme with the advantage that you can detect key sharing and lock accounts. You are right about one thing - marketing, as biometrics makes peoples eyes glow. But thats its only value, and irrelevant if you were actually going to sell this scheme, as its technical people who would make the choice - and such people are exceptionally good at seeing past bullshit in my experiance. Sorry to have such a negative view, but this scheme fails the KISS principal spectacularly;-)
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!