| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698 |
- @@@'s
- TODO for COLLISION
- ------------------
- box-box collision: adjust generated face-face contact points by depth/2 to
- be more fair.
- what happens when a GeomTransform's encapsulated object is manipulated,
- e.g. position changed. should this be disallowed? should a GeomTransform
- behave like a space and propagate dirtyness upwards?
- make sure that when we are using a large space for static environmental geoms,
- that there is not excessive AABB computation when geoms are added/removed from
- the space. the space AABB is pretty much guaranteed to cover everything, so
- there's no need to compute/test the AABB in this case.
- hash space: implement collide2() efficiently instead of the current
- simple-space-like brute-force approach.
- hash space: incremental scheme, so we dont have to rebuild the data structures
- for geoms that don't move.
- disabled geoms (remove from all collision considerations) ... isn't this the
- same as just taking it out of its enclosing group/space?
- integrate:
- dRay
- triangle collider - get latest tri collider code from erwin
- erwin's quadtree space
- tests:
- all aspects of collision API
- dGeomSetBody(0) maintains body-geom linked list properly.
- simple space: instantiate lots of non-moving geoms (i.e. environmental
- geoms and make sure that we're still able to collide efficiently.
- make sure AABB computation is efficient, or can be made efficient
- through proper use of the API.
- test C interface support for making new classes.
- make sure the dxGeom::aabbTest() function behaves as advertised.
- testing for contact point consistency: test for things that
- would cause the dynamics to fail or become unstable
- test for: small adjustment in geom position causes a big jump in the
- contact point set (bad for dynamics).
- test for: if contact constraints observed then it's impossible
- (or hard) to move the objects so that the penetration is
- increased. relax this when only a subset of the contact points are
- returned.
- test for consistency, e.g. the boundary of geoms X and Y can
- be defined by intersecting with a point, so test the intersection of X
- and Y by comparing with the point tests.
- check that contact points are in the collision volume
- all existing space tests, and more.
- demos:
- test_buggy: make a terrain out of non-moving geoms. use heirarchical
- groups to get efficient collision, even with the simple space.
- go though the new collision docs and make sure the behavior that is described
- there is actually implemented.
- multi-resolution hash table:
- the current implementation rebuilds a new hash table each time
- collide() is called. we don't keep any state between calls. this is
- wasteful if there are unmoving objects in the space.
- make sure we prevent multiple collision callbacks for the same pair
- better virtual address function.
- the collision search can perhaps be optimized - as we search
- chains we can come across other candidate intersections at
- other levels, perhaps we should do the intersection check
- straight away? --> save on list searching time only, which is
- not too significant.
- collision docs:
- optimization guide: whenever a single geom changes in a simple space,
- the space AABB has to be recomputed by examining EVERY geom.
- document this, or find a better behavior.
- TODO BEFORE NEXT RELEASE
- ------------------------
- g++ needed for compiling tests using gcc 3.2 ? what is the problem?
- add joint feedback info from lambda, so that we can get motor forces etc.
- need a way to map constraint indexes to what they mean.
- track down and fix the occasional popping/jumping problem in test_boxstack,
- especially when boxes are piled on top of each other. find out if this is
- caused by a configuration singularity or whether there is a bug in LCP.
- i need to add some kind of diagnostic tool to help resolve these kinds of
- problems.
- fixup ground plane jitter and shadow jumping in drawstuff.
- the inertias/COMs don't appear to be totally correct for the boxstack demo.
- fix up, and add a mode that shows the effective mass box (for a given density).
- Improve box-box collision, especially for face-face contact (3 contact points).
- Improve cylinder-box collision (2 contact points).
- windows DLL building and unix shared libs. libtool?
- also MSVC project files.
- dBodyGetPointVel()
- contrib directory - all stuff in ~/3/ode
- functions to allow systems to be copied/cloned
- dBodyTransplant (b, world)
- dTransplantIsland (b, world)
- dBodyCopy (bdest, bsrc)
- dJointCopy (jdest, jsrc) -- what about body connections?
- dCloneBody()
- dCloneJoint()
- dCloseBodyAndJointList()
- dCloneIsland()
- this collision rule:
- // no contacts if both geoms on the same body, and the body is not 0
- if (g1->body == g2->body && g1->body) return 0;
- needs to be replaced. sometimes we want no collision when both bodies are 0,
- but this wont work for geomgroup-to-environment. avoid stupid stuff like
- dGeomSetBody (geom_group, (dBodyID) 1);
- this also causes "failed-to-report" errors in the space test.
- Expose type-specific collision functions?
- Automatic code optimization process.
- joint limit spongyness: interacts with powered joints badly, because when the
- limit is reached full power is applied. fix or doc.
- various hinge2 functions may not function correctly if axis1 and axis2 are not
- perpendicular. in particular the getAngle() and getAngleRate() functions
- probably will give bogus answers.
- slow step function will not respect the joint getinfo2 functions calling
- addTorque() because it reads the force/torque accumulators before the
- getinfo2 functions are called.
- spaces need multiple lists of objects that can never overlap. objects in these
- lists are never tested against each other.
- deleting a body a joint is attached to should adjust the joint to only have
- one body attached. currently the connected joints have *both* their body
- attachments removed. BUT, dont do this if the dJOINT_TWOBODIES flag is set
- on the joint.
- document error, mem and math functions.
- Web pages
- credits section
- projects using ODE
- update C++ interface? use SWIG?
- collision exclusion groups - exclude if obj1.n == obj2.n ?
- make sure the amotor joint can be used with just one body. at the moment it
- only allows two-body attachments.
- implement dJointGetAMotorAngleRate()
- erwin says: Should the GeomGroup have a cleanupmode as the GeomTransform has?
- erwin says: http://q12.org/pipermail/ode/2002-January/000766.html
- and http://q12.org/pipermail/ode/2001-December/000753.html
- rename duplicate filenames (object.h?) - some environments can't handle this.
- naming inconsistency: dCreateSphere() should be dSphereCreate() (etc...) to
- match the rest of the API.
- TODO
- ----
- joint allocation in joint groups. allocation size should be rounded up using
- dEFFICIENT_SIZE, to properly align all the data members.
- all dAlloc() allocations should be aligned using dEFFICIENT_SIZE() ???
- automatic body & joint disabling / enabling.
- sometimes getting LCP infinite loops.
- function to get the entire island of bodies/joints
- joints:
- hinge2 joint - implement trail, i.e. non-convergent steering and wheel
- axes.
- erp individually settable for each joint?
- more joints:
- angular3 (constrian full angle not position)
- fixed path 1 (point must follow fixed path, etc etc)
- - other fixed path joints.
- linear a (point in 1 body fixed to plane of other)
- linear b (point in 1 body fixed to line on other)
- linear c (line in 1 body fixed to plane on other)
- linear d (line in 1 body fixed to line on other) - like
- prismatic but orientation along line can change
- Relative-Path-Relative-Oriention Joint (set all dofs of 2
- bodies relative to each other)
- spring (with natural length)
- universal (2 kinds)
- various angular relationships
- when attaching joints to static env, provision to move attachment
- point (e.g. give it a linear/angular velocity). this can be used
- instead of a FPFO joint on a body in many cases.
- also do this with contacts to static env, to allow for contacts to
- *moving* objects in the static env.
- interpretation of erp: is it (1) the error reduction per timestep,
- (2) or a time constant independent of timestep?? if it's (2) then
- perhaps this should be universal - this is already the meaning for
- the suspension.
- hinge2 suspension:
- suspension limits
- suspension limit restitution and spongyness??
- use autoconf? set paths in makefile?
- no-arg init functions, for andy
- explore: do joint parameters need to be set for the joint to be setup
- correctly, or should set some proper body-dependent params when it is
- attached? this is only really an issue for joints that have no parameters to
- set, such as the fixed joint.
- dAlloc() should take an arena parameters which is stored in dWorld.
- debugging mode should use dASSERT2 that prints a descriptive error message
- on error, not just the file:line or function. use dASSERT for internal
- consistency checking.
- when vectors and matrices are initialized, we must ensure that the padding
- elements are set to 0. this is going to be a problem everywhere!
- don't use 3-vectors anywhere. use SIMD friendly 4-vectors.
- make sure all data in body/joint etc objects is aligned well for single
- precision SIMD (i.e. all vectors start on a 16 byte boundary).
- think about more complicated uses of collision, e.g. a single geom representing
- an articulated structure.
- bodyGroup? (like joint group but for bodies). systemGroup?
- check the overhead of resizing Array<>s as elements are pushed on to them.
- replace alloca() with dPushFrame(), dPopFrame(), and dAlloca() ? allow for
- the possibility of allocating in non-stack memory ?
- make sure that we can set mass parameters with non-zero center of mass.
- if this is done after the body position is set, the position is adjusted.
- if this is done before the body position is set, what do we do when the
- pos is set? does the pos always refer to the center of mass from the user's
- point of view?
- consider splitting solver into functions, which can be optimized separately.
- might make things go faster.
- faster code for islands with a single body? faster code for dynamically
- symmetric bodies?
- rotation.cpp functions that set matrices should also set padding elements.
- lcp solver must return (L,d) and some other information, so we can re-solve
- for other right hand sides later on, but using the same complimentarity
- solution so there are no integrator discontinuities.
- dSetZero() - make fast inline functions for fixed n e.g. (1-4).
- need proper `sticky' friction, i.e. compensation for numerical slip.
- on windows, make sure gcc-compiles libs can be linked with VC++ apps. need
- to make sure some C++ runtime bits are present?
- kill all references to dArray<> (in geom.cpp).
- need testing code to test all joints with body-to-static-env
- copy stack.cpp, memory.cpp stuff to reuse
- dFactorLDLT() is not so efficient for matrix sizes < block size, e.g.
- redundant calls, zero loads, adds etc
- contacts: cheaper friction: viscous friction? one step delay friction force.
- in geom.cpp, for objects that are never meant to collide, dCollide() will
- always try to find the collider functions, which wastes a bit of time.
- geom.cpp:dCollideG() - handle special case of colliding 2 groups more
- efficiently.
- timer reporting function:
- void timerReport (void (*printFunction)(char *, ...));
- disabled bodies stored in a separate list, so they are never traversed at all,
- for speed when there are many disabled bodies.
- MAYBE
- -----
- new implementation for joint groups that is not so system dependent.
- maybe individual contacts are reusable? in this case contact information
- should be settable in the contact joints. max_size arg is really annoying.
- consider making anchor,axis, (everything) into a joint parameter and setting
- them with a consistent interface. also consider overload the joint functions
- so they are not distinguished by joint type??
- collision memory optimizations?
- collision: support for persistent contact information?
- multiply reference tri list data so that it can be cloned
- if the tri-list geoms could support rot/pos
- transformations then we could have several tri-lists pointing to the
- same vertex information.
- height fields
- pre-converted collision data -- Creating a hash space and associated
- opcode tree structures may take significant amounts of time for a
- large world with many 10s of thousands of triangles. Any chance of
- pre-building that off-line and passing a memory block pointer to the
- collision system?
- putting objects in multiple spaces -- If it was possible to add
- objects to more than one space, you could do collision queries other
- than 1vsN and NvsN. That flexibility might be useful when you want to
- only collide against a subset of the space. For example, a camera
- system may want to collide some rays with occlusion walls but the
- occlusion walls may also need to be in the game-level space to bounce
- against.
- ALWAYS
- ------
- make sure functions check their arguments in debug mode (e.g. using dASSERT).
- make sure joint/geom functions check for the specific object type.
- vectors alloca()ed on the stack must have the correct alignment, use ALLOCA16.
- library should have no global constructors, as it might be used with C linkage.
- use `const' in function arguments. blah.
- DON'T BOTHER
- ------------
- warning if user tries to set mass params with nonzero center of mass.
- DONE
- ----
- check: when contact attached with (body1,0) and (0,body1), check that polarity
- on depth and error info is okay for the two cases.
- set a better convention for which is the 1st and 2nd body in a joint, because
- sometimes we get things swapped (because of the way the joint nodes are used).
- hinge and prismatic, attachment to static environment.
- turn macros into C++ inline functions? what about C users?
- remove `space' argument to geom creation functions? make user add it?
- or just remove it from dCreateGeom() ? <-- did this one.
- test_chain should be in C, not C++. but first must remove global constructors.
- add more functionality to C++ interface - dMass, dSpace, dGeom
- there should be functions to delete groups of bodies/joints in one go - this
- will be more efficient than deleting them one at a time, because less
- partitioning tests will be needed.
- should we expose body and joint object structures so that the user can
- explicitly allocate them locally, or e.g. on the stack? makes allocating
- temporary contact constraints easier. NO --> helps data hiding and therefore
- library binary compatability.
- joints:
- hinge & slider - DONE
- measure angle, rate - DONE
- power - DONE
- joint limits - DONE
- mixed powered+limited joints, powering away from limit - DONE
- hinge2 - DONE
- steering angle and rate measurement - DONE
- steering limits - DONE
- steering motor - DONE
- wheel motor - DONE
- wheel angle rate measurement - DONE
- optional hinge2 suspension: - DONE
- alignment of B&S part to given axis - DONE
- global framework for giving epsilon and gamma - DONE
- toss away r-motor, make power & stuff specific to joint - DONE
- it's just easier that way
- joint code reuse: - DONE
- use standard functions to set velocity (c), limits (lo,hi),
- spongyness (epsilon) etc, this prevents these functions from
- proliferating
- implicit spring framework - actually allow joints to return a value `k'
- such that J*vnew = c + k*f, where f = force needed to achieve
- vnew - DONE
- contact slip - DONE
- contact erp & cfm parameters (not just "softness") - DONE
- hinge2: when we lock back wheels along the steering axis, there is no
- error correction if they get out of alignment - DONE, just use high
- and low limits.
- joint limit spongyness: erp and cfm for joint set from world (global)
- values when joint created. - DONE
- joint limit restitution - DONE
- check inertia transformations, e.g. by applying steering torque to a thin
- wheel --> actually, i made test_I
- more comprehensive random number comparisons between slow and fast methods.
- - random PD inertia (not just diagonal).
- - random velocity
- - random joint error (make joints then move bodies a bit)
- check that J*vnew=c (slow step already does this, but it doesn't equal zero
- for some reason! - actually, when LCP constraint limits are reached, it wont!)
- tons of things in lcp.cpp (@@@), especially speed optimizations. also, we
- wanted to do index block switching and index block updates to take advantage
- of the outer product trick ... but this is not worth the effort i think.
- lcp.cpp: if lo=hi=0, check operation. can we switch from NL <-> NH without
- going through C? --> done.
- andy says: still having trouble with those resource files..
- drawstuff.res doesn't seem to build or be found under cygwin gcc.
- DOC how bodies and geoms associated then resolved in contact callback ... not
- really necessary.
- fix the "memory leak" in geom.cpp
- library should have no global constructors, as it might be used with C linkage.
- --> as long as test_chain1 works, there are none.
- DOC cfm, the derivation and what it means.
- --> partially done, could be better
- joint "get type" function
- andy says: in ode/src/error.cpp _snprintf() and _vsnprintf() are missing
- in testode: finite and isnan are missing. copysign is missing
- russ: okay here's the problem: i have Makefile.platform files for
- VC++, MinGW, but not Cygwin. Cygwin uses the unix-like functions
- for everything, but the VC++/MinGW configs assumes the MS C-runtime
- functions. this is easy to fix, except i need to install Cygwin
- which is a pain to do over MinGW. argh.
- build on linux - assumptions made about location of X11 lib, opengl etc.
- implement: dBodyAddForceAtPos,dBodyAddRelForceAtPos,dBodyAddRelForceAtRelPos,
- dBodyGetPointPos,dBodyGetPointVel,dBodyGetPointRelVel
- dJointAttach(), allow both bodies to be 0 to put the joint into limbo.
- space near-callback should be given potentially intersecting objects 100 at a
- time instead of 1 at a time, to save on calling costs ... which are trivial,
- so we don't bother to do this.
- doccer: @func{} also refs second etc function in function *list*.
- make sure joints can return 0 from GetInfo1, i.e. no constraints or "inactive"
- joint, and the step functions will handle it.
- when attaching contact with (0,body), instead of setting the reverse flag
- on the joint and checking it in getInfo2(), we should just reverse the normal
- straight away ... ?
- --> trouble is, dJointAttach() knows nothing about what kind of joint
- it is attaching.
- hinge2 needs to be attached to two bodies for it to work, make sure this is
- always the case. --> assertion added in dJointAttach().
- if two joints connect to the same two bodies, check that the fast solver
- works! -> it should.
- functions to get all the joints/bodies a body/joint is connected to.
- If I don't have the GCC libraries installed, HUGE_VALF is undefined.
- fix capped cylinder - capped cylinder collision so that two contacts can
- be generated.
- transformation geometry object.
- joint groups should also be destroyed by destroying the world --> naaahhh.
- DONT DO THIS: body/joint creators with world = 0 --> not inserted into any
- world. allow bodies/joints to be detached from a world (this is what happens
- to grouped joints when a world is destroyed).
- can bodies and joints be linked together when not attached to world??
- what happens when we have an island of b/j, some of which are not in
- world? soln: dont keep lists of b/j in the world, just infer it from
- the islands?
- body & joint disabling / enabling
- start a change log.
- collision flags - 0xffff mask.
- dBodyGetFiniteRotationMode() / ...Axis()
- dBodyAddForceAtRelPos()
- ball & socket joint limits and motors.
- auto-build env on windows: 3 compilers, debug/release, short/double =
- 12 combinations --> auto logs.
- handle infinities better: HUGE_VALF is not commanly defined, it seems.
- get rid of the __USE_ISOC9X macro in common.h
- perhaps just use a "big" number instead of the actual IEEE infinity, it's
- more portable anyway.
- --> new config system
- dCloseODE() - tidy up *all* allocated memory, esp in geom.cpp. used to keep
- leak detectors happy.
- extra API to get lambda and J'*lambda from last timestep.
- better stack implementation that is not so system dependent. but how will
- we do dynamic page allocation? do we even need to?
- all collision files will now be collision_*, not geom_*
- check exported global symbols - no C++ mangling.
- rename dSphere etc to dxSphere etc.
- C interface support for making new classes.
- make sure DLL-ized stuff preserved ... but class numbers should no longer be
- exported.
- point geom ( = sphere of radius 0 )
- geoms stored in doubly linked lists in space (fast removal).
- bodies need to keep geoms pointers and call dGeomMoved() in dBodySetPosition()
- etc and world step. PROBLEM: links dynamics and collision together too much,
- makes it hard to extract ODE collision ... unless we say: dGeomMoved() and
- dGeomID must be supplied by the new collision library!
- dCollide() should take spaces as arguments - it should call dSpaceCollide2()
- with its own callback that puts all found contacts in the array, stopping
- when there is no more space left in the array.
- dxSpace::getGeom() - the geom numbers will change as geoms are dirtied - find
- some other numbering scheme, or document this behavior.
- the 'placeable' property - objects that should not ever be attached to bodies
- should flag an error when setBody etc are called.
- dGeomSetBody(0) - DOC: the position and orientation of the body will be
- preserved. in this case the geom should NOT be dirtied (dGeomMoved() should
- not be called).
- DOC: dGeomGetBodyNext() as part of dynamics/collision interface
- groups/spaces are subclasses of geom.
- groups/spaces can contain other groups/spaces. geom can be owned by a
- group/space. collision handling:
- geom-geom : standard collision function
- geom-group : special space code
- group-group : n^2 tests (or n space tests) - hard to optimize because
- of disjoint space representations.
- group internal : normal space internal-collision code
- groups/spaces can be told that some objects never move, i.e. that the objects
- are locked. should we lock the whole space?
- locking: the AABB for the object is not recalculated
- groups/spaces can be told that the internal contents self-intersect or not.
- actually an old ODE group is the equivalent of an old ODE simple space.
- - just call dCollide() or not.
- the group doesn't get passed to the space callback any more ... only the
- intersecting geoms get passed? maybe the callback can initiate the extra
- intersection tests itself? (because we want programmable flexibility to
- determine what gets intersected and what doesn't)
- - NO
- infrastructure to indicate when an object has moved (and thus its AABB needs
- to be recalculated)
- space enumeration functions. make sure that there are no additions or deletions
- while enumeration is taking place.
- - documented the behavior, didn't disallow it
- cache the AABB in the dxGeom? (for non-moving objects) - perhaps keep a
- pointer to separately allocated space? ... no
- DOC: dGeomGetClass() is a first-class geom function, not in the "User
- defined classes" section. it returns a constant that can be checked
- against dSphereClass etc.
- remove dxGeom dependence on dBodyID? ... not yet
- dBase -> dxBase
- allow a geom to be inserted into multiple spaces? need this to optimize some
- kinds of tests ... no
- update docs.
- make CHECK_NOT_LOCKED an assert.
- DOC: "Calling these functions on a non-placeable geom results in a
- runtime error." ...in the debug build only?
- non-placeable geoms should not allocate dxPosR. perhaps pass a dGeom
- constructor arg that says 'placeable' or not - this also sets the
- GEOM_PLACEABLE flag.
- GeomTransform:
- final_pos and final_R valid if no GEOM_AABB_BAD flag!!!
- fix up this code, esp use of ComputeTX().
- Space incompatibilities: no dSpaceDestroy(), dGeomDestroy() does not
- take a dSpaceID ... dSpaceDestroy() added.
- GeomGroup incompatibilities:
- dCollide() used to take a GeomGroup and would return all the contact
- points for all the intersecting objects. now you have to call
- dSpaceCollide2() and get a callback for each one.
- need to provide old behavior.
- simple space optimization: we should keep the precomputed AABB for the
- non-moving geoms around, so that when the other geoms move we can just
- compute the AABBs for those geoms and then combine it with the non-moving AABB.
- --> too hard!
- collision build options: old and new
- tidyups for collision:
- * rationalize what stuff goes in what source files, and file names
- * minimize set of header files that all collision* sources use - after
- all changes.
- * update ode-cpp stuff (C++ interface header files).
- porting guide:
- ODE list email
- dGeomGetSpaceAABB() deleted
- dGeomGetClass (geom_group); used to return a unique type for
- GeomGroups, but now it returns dSimpleSpaceID.
- tidyups: update DLL declarations.
|