|
#1
|
|||
|
|||
slow intersect call
I am having serious slowdowns in my Vizard script. I tracked it down to the fact that I am calling viz.intersect 180 times in a single callback. The 180 iteration loop takes around 0.15 seconds to run. This is werid because pressing F4 twicde shows me that the update is only suppossed to be taking 30-100 milliseconds.
Two things: 1) Is the value shown for Updates when the f4 stats are shown actually in MILLI seconds? 2) Is there a faster call than viz.intersect in Vizard 2.53g? |
#2
|
|||
|
|||
Strange. I was putting the viewpoint inside of an avatar and using that avatar as the body to detect for collisions. I was doing the 180 line intersections because I was simulating a laser range finder which returns distances to objects in a plane. The laser was not inside the mesh of the avatar, but very close to its front. None of the 180 rays ever touched the body enclosing the viewpoint; however, if I make the avatar that the viewpoint is inside of not visible, then this fuction speeds up a bit by a factor of 2 (0.08 seconds). This is weird to me, but I can live with weirdness.
I still think that 0.08 seconds to calculate 180 intersections seems a bit slow, and would like to know if there is a faster way to cast rays and get the locations (or distances) of the intersection points in the world. |
#3
|
|||
|
|||
Hi,
1) The values should be in milliseconds. 2) In 2.53 the viz.intersect() command is pretty much your only option. You might be able to speed up the call by disabling collisions with objects that you are not interested in. Code:
object.disable(viz.COLLISION) Vizard 3.0 allows you to use the underlying physics engine to perform intersection tests, which will be optimized for the collision shapes defined for each model. I just did a test with a simple scene, and performing 100 intersections per frame caused the update time to be 25 ms using viz.intersect() and 2.5 ms using the physics line intersect command. |
#4
|
|||
|
|||
Quote:
Even though the laser line was not inside the mesh of the avatar, it was inside its bounding box. When Vizard is performing intersection tests it will first check if the line intersects with an objects bounding box. If it does, it will proceed to check if the line intersects with each triangle. |
#5
|
|||
|
|||
I am getting 80ms with just my "indoor" environment, which is pretty simple. Maybe I should try to separate the walls from the ceiling and floor and add them both to vizard since I never care about intersecting with the seiling or floor.
Last edited by pbeeson; 09-11-2006 at 03:31 PM. |
#6
|
|||
|
|||
Unless your floor and ceiling contain a lot of triangles, it's probably not going to make much of a difference. But if you want to try it out, you don't need to create separate models for them. Simply specify the name of the floor/ceiling mesh when disabling collisions. Example:
Code:
room.disable(viz.COLLISION,'ceiling') room.disable(viz.COLLISION,'floor') |
#7
|
|||
|
|||
I noticed in version 3 that viz.phys.intersectLine() is much faster than viz.intersect(), but viz.phys.intersectLine seems to have some problems:
1) It returns intersections for non-visible objects (object whose visibility is set to off), which is different that viz.intersect() 2) It ignores the viz.disable(viz.COLLISION) command. Is there a way to get it to ignore certain objects? I can run viz.phys.intersectLine(begin,end,True) to get a list and then check object IDs, but I don't know if there is an easier way (especially considering that if you have many objects, it might be an optimzation to not check for intersections with particular objects at certain times, e.g. if you are casting rays from within an object). 3) As I said earlier, I am casting 180 "rays" from a virtual laser range finder. When I do this, viz.phys.intersectLine() is much faster than viz.intersect() (Even if I set the all flag to True), but viz.phys.intersectLine actually misses some intersections with the closest objects, while viz.intersect() does not. I'll post two picture to illustrate my point. Last edited by pbeeson; 09-12-2006 at 07:20 AM. |
#8
|
|||
|
|||
Pertaining to point 3 from above posting.
Notice that in the left image, some of the rays cast from the "robot" I have in Vizard (shown as a rectangle) go through the wall (white line in grey space). I believe this is a bug in viz.phys.intersectLine() When I use viz.intersect() instead of viz.phys.intersectLine(), all rays properly intersect the wall (right image). (These details don't show up well in the thumbnails, but do in the fuill size images. |
#9
|
|||
|
|||
Is there a collision shape defined for the wall, probably with collideMesh()? viz.phys.intersectLine() only intersects with VizPhysicsShapes, not model geometry.
__________________
Paul Elliott WorldViz LLC |
#10
|
|||
|
|||
Quote:
|
#11
|
|||
|
|||
Do these missed intersections occur near a triangle boundary?
|
#12
|
|||
|
|||
Quote:
Last edited by pbeeson; 09-12-2006 at 04:08 PM. |
|
|