Bounding Box Wire
Blitz3D Forums/Blitz3D Programming/Bounding Box Wire
| ||
..hey guys, im looking for function for creating bounding box (lined one) around any object/entity, according to its size...anyone did this? |
| ||
A 3d box or a 2d box? |
| ||
3D box..i do have some code but it seems that its rendering expensive once I have plenty of objects around.. |
| ||
Create a cube. Use fitmesh on it, to fit to the entities dimensions. Then, texture the cube, with a masked texture, only having the outline drawn. |
| ||
I've had problems (misunderstandings) with fitmesh. Can you knock up a simple example? |
| ||
@ John, Bare in mind that the first 3 params are a reference point ( I always use bottom/left/rear ) , the last 3 are the scale. So to center a mesh and retain the size do .. Width# = meshwidth( mesh ) height# = meshheight( mesh ) depth# = meshdepth( mesh ) fitmesh mesh, -Width*.5, -Height*.5, -Depth*.5, Width, Height, Depth. This clearly doesn't work when either width, height or depth = 0. Stevie |
| ||
Here's a small demo.Graphics3D 800,600,0,2 Global camera=CreateCamera() CameraZoom camera,1.6 MoveEntity camera,0,0,-90 WireFrame True ; make the bounding box cube... Global highlightcube=CreateCube() EntityFX highlightcube,1 EntityColor highlightcube,0,255,0 Global mesh ; make some objects to play with... Type obj Field entity End Type Function makeObjects() For x=1 To 10 objs.obj=New obj If Rand(1,2)=1 Then objs\entity=CreateCone() Else objs\entity=CreateSphere() EndIf EntityFX objs\entity,1 EntityPickMode objs\entity,2 PositionEntity objs\entity,Rand(-50,50),Rand(-50,50),Rand(50,50) RotateEntity objs\entity,Rand(360),Rand(360),Rand(360) EntityColor objs\entity,Rand(0,1)*255,Rand(0,1)*255,255 ; scale the mesh... its important to use scale mesh otherwise you will have problems with the mesh dimension commands scale#=Rnd(1,10) ScaleMesh objs\entity,scale,scale,scale Next End Function ; function to check if the mouse is over and object and if so move the bounding box to it and resize it... Function checkObjects() CameraPick camera,MouseX(),MouseY() If PickedEntity()<>0 Then mesh=PickedEntity() EndIf If mesh<>0 Then ShowEntity highlightcube Width# = MeshWidth( mesh ) height# = MeshHeight( mesh ) depth# = MeshDepth( mesh ) FitMesh highlightcube, -Width*.5, -Height*.5, -Depth*.5, Width, Height, Depth RotateEntity highlightcube,EntityPitch(mesh,1),EntityYaw(mesh,1),EntityRoll(mesh,1) PositionEntity highlightcube,EntityX(mesh,1),EntityY(mesh,1),EntityZ(mesh,1) Else HideEntity highlightcube EndIf End Function ; the main loop... makeObjects() While Not KeyDown(1) ; turn the objects For objs.obj=Each obj TurnEntity objs\entity,0.2,0.02,0.2 Next ; check for the mouse over and move the bounding box checkObjects() RenderWorld Flip Wend I would also suggest looking at the Draw3d library that is floating around it. It has a nice line draw function, which you could use to draw a nice bounding box. |
| ||
Adding to the above posted code...WireFrame False ; Turn false to see effect. ; make the bounding box cube... Global highlightcube=CreateCube() EntityFX highlightcube,1 + 16 ; Add double-sided. EntityColor highlightcube,0,255,0 bound_texture = LoadTexture("bounding.png", 4 + 256) ; with masking and no mipmapping EntityTexture highlightcube, bound_texture For the texture simply make like a 256x256 color 0,0,0 black image. Then draw a 3 or so pixel border around the image in the color you want your highlight to be. |
| ||
Very nice, Uncle and Vertigo. Super-efficient. Before, I was getting every vertex position, left, top, right, bottom-most, then drawing a 2D box to the screen - very inefficient. Thanks. |
| ||
I had a problem with the eshdepth/height/width. If you use ScaleEntity, you will need to loop through all the vertex positions to get to proper depth/height and width of the mesh. SO, avoid using scaleentity if you can. Else your end up looping through all the vertices. |
| ||
No need to loop through vertices .. this should work ..global G_Sx#, G_Sy#, G_Sz# Function GetScale( Mesh ) ;take a copy and reset it's rotation tmp = copyentity( mesh ) rotateentity tmp,0,0,0 tformvector 1,1,1, tmp, 0 G_Sx = tformedx() * meshwidth( mesh ) G_Sy = tformedy() * meshheight( mesh ) G_Sz = tformedz() * meshdepth( mesh ) freeentity tmp End function You could probably also use the getmatelement commands to get quicker access. |
| ||
Ah, nice solution! |
| ||
IMO the tform commands are the most useful in Blitz - I definately couldn't like without them :) |