..hey guys, im looking for function for creating bounding box (lined one) around any object/entity, according to its size...anyone did this?
Bounding Box Wire
Blitz3D Forums/Blitz3D Programming/Bounding Box Wire 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?
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
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.
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.
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...
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.
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.
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 ..
You could probably also use the getmatelement commands to get quicker access.
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 :)