Lineofsight3d help

Blitz3D Forums/Blitz3D Programming/Lineofsight3d help

hi I am working with the lineofsight3d function, which can be found here ---http://www.blitzbasic.com/codearcs/codearcs.php?code=532--- and can only get it to work with objects such as a cone,circle ect. I am trying to get a loaded MD2 model, or any other model such as .B3d ect., to use the function but it always returns false.

Any help would be very welcome
thank you

Not sure but doubt animated models will work as the function relies on the mesh geom being pickable.

This slight modification will work with non-pickable meshes but is not as accurate as you can see ...

Function LineOfSight3D(observer,target,viewrange#=10.0,viewangle# = 90.0)

	;distance between observer and target
	Local dist# = EntityDistance(observer,target)

	;check if the target is within viewrange 
	If dist<=viewrange
		
		;observer vector
		TFormVector 0,0,1,observer,0
		Local ox# = TFormedX()
		Local oy# = TFormedY()
		Local oz# = TFormedZ()
	
		;pick vector
		Local dx# = (EntityX(target,True)-EntityX(observer,True))/dist#
		Local dy# = (EntityY(target,True)-EntityY(observer,True))/dist#
		Local dz# = (EntityZ(target,True)-EntityZ(observer,True))/dist#

		;dot product
		Local dot# = ox*dx + oy*dy + oz*dz

		;check if the target is within the viewangle
		If dot => Cos(viewangle/2.0)
			; check if something is blocking the view
			Picked = LinePick(EntityX(observer,True),EntityY(observer,True),EntityZ(observer,True),dx*dist,dy*dist,dz*distance,0.01)
			If PickedTime() < 1.0
				Return True
			EndIf
			
		;	If LinePick(EntityX(observer,True),EntityY(observer,True),EntityZ(observer,True),dx*viewrange,dy*viewrange,dz*viewrange,0.01)=target
		;		; observer can see target
		;		Return True
		;	End If
		End If
		
	End If

	; observer cannot see target	
	Return False

End Function


An alterative would be to create a cube or sphere, scale it for an approximate fit to your mesh , set entityalpha to 0, set pickmode to 2 and parent your animated mesh to this cube.

Stevie

hey, thanks for the quick responce, but I dont think the pick mode is my problem.I can get objects(like a cone,cube ect.) to see the loaded mesh's but I cant get loaded mesh's to see anything else

for example
visible2 = LineOfSight3D(enemy\entity,c4,vd,va) doesnt work but
visible2 = LineOfSight3D(c3,enemy\entity,vd,va)
does The C3 is just the cone from the LINEOFSIGHT3d code and C4 is the circle

Strange. I could take a look if you e-mail me the model and code.

hey, thanks this is the non-working parts of the LINEOFSIGHT3d function, any help would be more than welcome... you will need to replace the enemy with your own model

vd# = 100.0
va# = 90.0

visible2 = LineOfSight3D(enemy\entity,c4,vd,va)

Function LineOfSight3D(observer,target,viewrange#=10.0,viewangle# = 90.0)

Local dist# = EntityDistance(observer,target);
If dist<=viewrange

TFormVector 0,0,1,observer,0
Local ox# = TFormedX()
Local oy# = TFormedY()
Local oz# = TFormedZ()

Local dx# = (EntityX(target,True)-EntityX(observer,True))/dist#
Local dy# = (EntityY(target,True)-EntityY(observer,True))/dist#
Local dz# = (EntityZ(target,True)-EntityZ(observer,True))/dist#

Local dot# = ox*dx + oy*dy + oz*dz
If dot => Cos(viewangle/2.0)
If LinePick(EntityX(observer,True),EntityY(observer,True),EntityZ(observer,True),dx*viewrange,dy*viewrange,dz*viewrange,0.01)=target
Return True
End If
End If

End If

Return False
End Function


here is the enemy

Global enemy.enemy = New enemy
enemy\entity = LoadMD2("MODEL.md2")
ScaleEntity enemy\entity,0.04,0.04,0.04
pogo_tex = LoadTexture("mesh.bmp")
EntityTexture enemy\entity,pogo_tex
PositionEntity enemy\entity,25,6,120
RotateEntity enemy\entity,0,180,0
AnimateMD2 enemy\entity,1,0.1,41,46
EntityRadius enemy\entity,.9
EntityType enemy\entity,ENEMY_TYPE
EntityShininess enemy\entity,1
enemy\x# = 0
enemy\y# = 200
enemy\responce=IDLE
enemy\z# = 50
enemy\state = IDLE
enemy\life# = 100.0
enemy\range# = 50.0
enemy\botty=enemy\entity
enemy\current_waypoint=1
EntityPickMode enemy\entity,1

and here is a target

c4=CreateSphere()
EntityColor c4,128,50,50
PositionEntity c4,2,1,-6
EntityPickMode c4,2
HidePointer

Ah, I think it's because you are using the sphere picking mode for the enemy. And unlike polygon picking mode, it will compute a pick even if the linepick is done from inside the sphere and out. To avoid it you can offset the linepick from the enemy first.

Try with this version:
Function LineOfSight3D(observer,target,viewrange#=10.0,viewangle# = 90.0,offset#=1.0)

	;distance between observer and target
	Local dist# = EntityDistance(observer,target)

	;check if the target is within viewrange 
	If dist<=viewrange
		
		;observer vector
		TFormVector 0,0,1,observer,0
		Local ox# = TFormedX()
		Local oy# = TFormedY()
		Local oz# = TFormedZ()
	
		;pick vector
		Local dx# = (EntityX(target,True)-EntityX(observer,True))/dist#
		Local dy# = (EntityY(target,True)-EntityY(observer,True))/dist#
		Local dz# = (EntityZ(target,True)-EntityZ(observer,True))/dist#

		;dot product
		Local dot# = ox*dx + oy*dy + oz*dz

		;check if the target is within the viewangle
		If dot => Cos(viewangle/2.0)
			; check if something is blocking the view
			If LinePick(EntityX(observer,True)+dx*offset,EntityY(observer,True)+dy*offset,EntityZ(observer,True)+dz*offset,dx*viewrange,dy*viewrange,dz*viewrange,0.01)=target
				; observer can see target
				Return True
			End If
		End If
		
	End If

	; observer cannot see target	
	Return False

End Function

And set the offset parameter so it is larger than the radius of the enemy... That should work. I think :)