Beams
Blitz3D Forums/Blitz3D Beginners Area/Beams
| ||
Hi, I am trying to create a beam based on a cylinder object. I want to be able to create a cylinder object to be created from the camera out to another cube. Basically I want to use this to create a laser/phaser beam. I can then start playing around effects on this object. So when I press a mouse button (left), a cylinder is created between camera and a cube that is moving in a circle around the Z axis.. I cannot figure it out and some examples I found looked a little complicate ( simple that I am! ) Cheers Mango |
| ||
I would try to cyl=createcylinder() fitmesh cyl,-1,0,-1,2,2,2 hideentity cyl ... while (endofgame=0) and keydown(1)=0 if mousehit(1) showentity cyl pointentity cyl,targetmesh scaleentity cyl,1,entitydistance(camera,targetmesh),1 endif ... wend But there's a problem when there is no target mesh. So you first should do a camerapick. (Entitypickmode for all meshes must be set correctly). If there is a mesh behind the crosshair or so, you can use it as targetmesh. If there is nothing, you may position a dummy pivot at that location and use it as targetmesh. Please note when you texturemap the cylinder, you may alter the ScaleTexture dynamicly to make it fit the beam lenght. EDIT: To limit the max beam range yoiu may use an invisible sphere that will give you the position for a dummy pivot if you didn't hit anything: helperpivot=createpivot() s=createsphere() scaleentity s,100,100,100 flipmesh s entitypickmode s,2 entityalpha s,0 entityparent s,camera ... ; then somewhere inside the mainloop, right before you point the beam to the target: pick=camerapick(camera,graphicwidth()/2,graphicsheight()/2) if pick=s ; didn't hit a real mesh positionentity helperpivot,pickedx(),pickedy(),pickedz(),1 targetmesh = helperpivot endif |
| ||
Excellent... you could modify this to cast a point onto a target like a lasersight I think... Let me play with it RZ |
| ||
Ahh fantastic.. will have a play with this. Many thanks. Luckily there has to be a target in my game, you must lock on first before firing. Although eventually I want the player to be able to fire manually if their targeting systems are damaged, but that is for the future :-) Mango |
| ||
the laser code in the archives does something similar by stretching a primitive cube between two entities. http://www.blitzbasic.com/codearcs/codearcs.php?code=429 |
| ||
Erk.. not sure about this. Tried the first example and get the below screenshot... Any ideas where I went wrong? Whilst I am here, how do you post code. So if need be it will be easier to understand? ![]() It seems the beam is pointing along the wrong axis? It does turn toward the cube (borg cube), but not on the right axis. Cheers Mango |
| ||
Did you try rotating the original cylinder? And the code for posting is {code}your code here...{/code}only with [ instead of }. |
| ||
Hmm maybe you need a RotateMesh command in there when the 'beam' is created... |
| ||
Yup, you need the cylinder mesh to be pointing along the z axis initially before you point it as pointentity aligns on the z axis. Set up the beam entity like this ... Beam = createcylinder() Rotatemesh Mesh , 90, 0, 0 Positionmesh Beam,0,0,1 Scalemesh Beam,1,1,.5 Then ... Pointenity Beam , Target Scaleentity beam , 1 , 1, entitydistance( Beam , Target ) Note that Scaling on the Y axis is wrong ... should be the z axis. Stevie |
| ||
uh, sorry thought the "point-to-axis" of y cylinder is it's y-axis. yes, simply use Rotatemesh cyl,90,0,0 once after creation, then use the scaling with the z-axis, this should work. This happens when you pseudo-code all the time :) . |
| ||
Ok, Seems to work better now. But my beam seems to hit beyond the cube. Not sure what I have done here. Is there something I have done wrong? Sorry about the lack of comments! Mango ;================================================================== Global graphic_x$=1600 Global graphic_y$=900 Global graphic_depth$=32 Global graphic_window$=1 Global started$ Global fntarial$=LoadFont("Arial",8,False,False,False) Global temp$ Global screendebug = 1 Global movement = 0 Global Collision$ Global torplive# Global wp_id$ Global appname$="Face Off" Global enemy1col=1 Global torpcol=1 Global title$ = appname+" - Build "+versionlong+" - Version "+versionshort Global specs$ = "Available Memory: "+AvailPhysicalRAM()+" Total Ram Used: "+TotalPhysicalRAM()+" CPU Speed: "+CPUSpeed() AppTitle (title) ; create screen SetBuffer BackBuffer() graphic_window=screendebug Graphics3D graphic_x, graphic_y, graphic_depth, graphic_window ; Creation of standard game variables Global ship_power# = 5000 Global shield# = 100 Global torp_capacity# = 100 Global torp_max# = 100 Global torp_recharge# = 0.25 Global torp_yield# = 20 Global phaser_capacity# = 100 Global phaser_max# = 100 Global phaser_yield#= 5 Global phaser_recharge# = 1.25 Global enemy1_shippower# Global enemy1_shield# = 1000 Global enemy1_torp_recharge# Global enemy1_phaser_recharge# ; setup 3d components Global tex2 = LoadTexture("beam.bmp",3) Global enemy1=CreateCube() Global tex=LoadTexture( "borg.jpg",1 ) EntityTexture enemy1,tex EntityFX enemy1,2 PositionEntity enemy1,+4,+1,+4 EntityRadius enemy1,1.5 EntityPickMode enemy1,2 ; check if pick mode is quicker on rectangle EntityRadius (enemy1,1) EntityType (enemy1, 2) Global shieldsph=CreateSphere() ScaleEntity shieldsph,0.01,0.01,0.01 EntityFX shieldsph,1 EntityTexture shieldsph, tex2 Global torp=CreateSphere(8) EntityRadius (torp,1) EntityType (torp,1) ScaleEntity torp,0.25,0.25,0.25 HideEntity torp Global beam=CreateCylinder(8) ;FitMesh beam,-1,0,-1,2,2,2 RotateMesh (beam,90,0,0) PositionMesh beam,0,0,1 ScaleEntity beam,0.5,0.5,1 HideEntity beam EntityFX beam,1 EntityTexture beam, tex2 Global camera=CreateCamera() PositionEntity camera,0,0,-4 Global light=CreateLight(1) PositionEntity light,0,-4,0 Global crosshair=LoadImage ("crosshair.bmp") Global conftorp=LoadSound("torp-fired.wav") Global torpsnd=LoadSound("torp.wav") Global locked=LoadSound("locked.wav") Global explosion=LoadSound("explosion.wav") Global phasersnd=LoadSound("phaser.wav") Collisions 1,2,2,1 ; Main Loop While Not KeyHit(1) Locate 0,850:Print"System Information: "+specs Locate 10,700:Print "Ship Power: "+ship_power Locate 10,710:Print "Torp Capacity: "+torp_capacity Locate 10,720:Print "Phaser Capacity: "+phaser_capacity Locate 10,730:Print "Enemy Shield: "+enemy1_shield Locate 10,750:Print "Enemy Distance: "+EntityDistance(camera,shieldsph) DebugLog("Main loop") enemymove() PositionEntity (shieldsph,EntityX (enemy1),EntityY (enemy1), EntityZ (enemy1)) locktarget() If wp_id = enemy1 And MouseHit(1) Then fire_torp() EndIf If torplive = 1 Then torp() EndIf If MouseDown(2) And phaser_capacity => 0 PointEntity beam,enemy1 ScaleEntity beam,0.10,0.10,EntityDistance(camera,shieldsph) ShowEntity beam phaser_capacity = phaser_capacity - 2 PlaySound phasersnd EndIf If phaser_capacity =< 0 Then HideEntity beam If MouseDown(2) = False Then HideEntity beam If torplive = 1 Then MoveEntity torp, 0, 0, 2 collide() energy() UpdateWorld RenderWorld DrawImage crosshair,MouseX(),MouseY() ; Draw the image! Flip Wend ; FUNCTIONS Function torp() If EntityX(torp) > 300 Then HideEntity torp:torplive=0 If EntityY(torp) > 300 Then HideEntity torp:torplive=0 If EntityZ(torp) > 300 Then HideEntity torp:torplive=0 ;If torplive = 1 Then MoveEntity torp, 0, 0, 2 End Function Function fire_torp() If torp_capacity => torp_max Locate 10,30:Print"Target Locked" ShowEntity torp PositionEntity torp,0,0,0 PointEntity torp, enemy1 PlaySound(conftorp) PlaySound(torpsnd) torplive=1 torp_capacity = torp_capacity - 100 EndIf End Function Function enemymove() TurnEntity enemy1,.0,-0.1,.0 MoveEntity enemy1,-0.05,0,0 End Function Function locktarget() wp_id=CameraPick ( camera,MouseX(),MouseY()) Locate 10,10:Print wp_id If wp_id = enemy1 Locate 10,30:Print"Target Locked" End Function Function collide() If EntityCollided(enemy1,torpcol) Text 30,40,"Hit2" HideEntity torp torplive=0 PlaySound(explosion) enemy1_shield=enemy1_shield - torp_yield EndIf End Function Function energy() If enemy1_shield < 0 Then enemy1_shield = 0 If torp_capacity < 0 Then torp_capacity = 0 If torp_capacity => torp_max Then torp_capacity = torp_max ;If phaser_capacity <= Then phaser_capacity = 0 If phaser_capacity => phaser_max Then phaser_capacity = phaser_max torp_capacity = torp_capacity + torp_recharge phaser_capacity = phaser_capacity + phaser_recharge If torp_capacity =< 100 ship_power=ship_power - torp_recharge EndIf End Function |
| ||
Change this line ScaleEntity beam,0.5,0.5,1 to ScaleEntity beam,0.5,0.5,.5 Remember the distance it's scaled will be doubled as it's already of length 2 units. I did mention this in my previous post. Stevie |
| ||
tried that, that's what I thought the problem was, but the beam still appears through the cube. Mango |
| ||
Could it be that your collision check is failing, and the beam is hiding when it's at > 300? |
| ||
No the torp should be hiding at > 300. No collision has been created yet. I have scaled the cube to a larger size, which covers the beam sticking out the other end, I do think Stevie is right by scaling, just not sure whether that is the solution to scale every enemy I would be firing at. Mango |
| ||
Your camera is at Z-4 and the beam is at Z=0 |