referring objects in a b3d file

Blitz3D Forums/Blitz3D Beginners Area/referring objects in a b3d file

sec05(Posted 2004) [#1]
Hi, want to ask something here.

I used an external program (xworld 3d) to import my .3ds models and place them in position. Well, I exported it the scene out as a b3d file.

Let's say I have a cube on a plane. When I export them out as a single b3d file (using 3ds max or xworld 3d in this case), how do I import it into blitz? And how do I refer to the objects in the scene?

For example, I want the cube to move around. When I import the b3d format, how do I code so that the cube can move around? Do I refer it by its name in the scene?

Thanks!


semar(Posted 2004) [#2]
If your .b3d file contains only one object, ex. a cube, then you just need:
global cube = loadmesh("my_b3d_file.b3d")

and then use all the entity command on the entity named 'cube', for example:
moveentity cube, 0,0,1


If you have more than one object in the .b3d file, such a plane and a cube, assuming that you have named each object in 3dsmax or xworld3D before exporting the whole file as a .b3d, then you may use the
FindChild command: http://www.blitzbasic.com/b3ddocs/command.php?name=FindChild&ref=goto
to locate any child entity, and use it, again, as a normal entity.

For example, you have named the plane as "myplane" and the cube as "mycube" in 3dmax.

Then you could do:
global cube
myobj = loadmesh("my_b3d_object.b3d")
cube = findchild myobj,"mycube"
moveentity cube,0,0,1
;ecc. ecc


Have a look also at the following commands:
FindChild
GetChild
CountChildren
under entiy state category, and also GetParent in the entiy control category:
http://www.blitzbasic.com/b3ddocs/command_list_3d_cat.php

Hope this helps,
Sergio.

P.S.
You are of course aware of the 3D object creation capability of B3D, which includes also CreatePlane and CreateCube, aren't you ?
;-)


sec05(Posted 2004) [#3]
Thanks for the reply.

Got another question here. If I want to use the camera created in xworld 3d (rather than create it in blitz), how do I refer it in blitz then?

Is it the same as referring it to the name using the FindChild command?

Actually, I wanted to create the camera in blitz, but because I find it hard to control the camera by typing the coordinates, so I turn to xworld 3d to position my camera.

Thanks!


semar(Posted 2004) [#4]
Once you have positioned your camera from within xworld, you can use it as a pivot to create the camera object in blitz.
- pivot = findchild(mesh,"mycamera")
- createcamera(pivot)

Sergio.


Eric(Posted 2004) [#5]
I believe you need the command LoadAnimMesh To Keep the Heiarchy(sp) intact.

Regards,
Eric


sec05(Posted 2004) [#6]
I tried using the FindChild command, but it didn't work. I created a simple scene with a cube and a plane. I wanted to move the cube in the scene.

scene = LoadMesh("group.b3d")
player = FindChild(scene, "Box")

While Not KeyHit(1)
If KeyDown(17) Then
MoveEntity player, 0, 0, 2
EndIf

UpdateWorld
RenderWorld
Flip
Wend
End

When I hit the key "w" It pops out "entity does not exist". I checked the debug window and the player returns 0 value, which means it didn't load.

Anyone knows why?


Beaker(Posted 2004) [#7]
You need to use LoadAnimMesh to keep the sub-objects intact.

You can also try running this over it:
scene = LoadAnimMesh("group.b3d") 

ent = scene
While ent
	DebugLog EntityName(ent)
	ent = NextChild(ent)
Wend

Function NextChild(ent)
	If CountChildren(ent)>0
		Return GetChild(ent,1)
	EndIf

	Local foundunused=False
	Local foundent = 0, parent,sibling
	While foundunused=False And ent<>0
		parent = GetParent(ent)
		If parent<>0
			If CountChildren(parent)>1
				If GetChild(parent,CountChildren(parent))<>ent
					For siblingcnt = 1 To CountChildren(parent)
						sibling = GetChild(parent,siblingcnt)
						If sibling=ent
							foundunused = True
							foundent = GetChild(parent,siblingcnt+1)
						EndIf
					Next
				EndIf
			EndIf
		EndIf
		ent = parent
	Wend
	Return foundent
End Function