interlocking meshes
Blitz3D Forums/Blitz3D Beginners Area/interlocking meshes
| ||
| I don't exactly know the right words for this, but I'll let the pictures do the talking. Basically I have my gun model in, and the beginning of my city, however, somethings messed up, the building might look 6 feet away from me, but when I point the gun in that direction, it goes through the object. I know there's not a lot I can do to help that, except I want it to happen at a closer range, what should I do? Thanks, Chad |
| ||
| Tinker with the EntityOrder command: http://www.blitzbasic.co.nz/b3ddocs/command.php?name=entityorder&ref=goto |
| ||
| Or, do multiple renders with the hand and gun. |
| ||
| Don't use EntityOrder (it can screw up your model if made from more than one part), use multiple renders. |
| ||
| Ahhhh true @ Beaks. I reckon you could probably get away with using a pair of entityorder commands, setting the arm to draw after the gun, but the multiple render passes are probably more solid. |
| ||
| Ok, your going have to explain to me how I do multiple renders.. I'm lost |
| ||
| Create two cameras, one for the main render and a second one to render the hand and gun (plus possibly your heads-up-display if you're using a 3d HUD). Position the second camera setup somewhere where it won't interfere with your main world area (I put mine 500 units below the main world area), and give it a max entity distance value that clips as close to the second camera as you can get to prevent your main world from being rendered by the second camera. Give the second camera an entityorder of -1 to force it to render last (this won't stuff up the z-ordering for the models the way it will if you use entityorder directly on models) and use 'CameraClsMode <second camera>, False, True' to stop the second camera from clearing the background where your main world will be rendered. eg. Function CreateHUD() ; -- Setup HUD camera HUD_camera = CreateCamera() PositionEntity HUD_camera, 0.0, -500.0, 0.0 CameraRange HUD_camera, 0.2, 5.0 CameraZoom HUD_camera, 1.6 CameraClsMode HUD_camera, False, True EntityOrder HUD_camera, -1 End Function You may also want to consider making your hand and gun model smaller by using ScaleMesh or ScaleEntity, and move them closer to the camera, if they're poking through a wall that's six feet away. Personally though, I have some doubts about the perspective that Blitz3D uses. Everything generally looks half the size it should. To get correct lighting on the hand and gun models, parent them to the second camera and rotate the second camera to match the rotation of your game character. If this interferes with the lighting on any 3D HUD graphics you may have, you may need a third camera for the HUD graphics. -- |
| ||
| Thanks for the descriptive writing.. I'll try it and let you know how it goes. |
| ||
| chad, don't know if your using 3dsmax at all, probably not.. but if you are B3d pipeline lets you set up a lot of these types of things within 3dsmax with simple plugin GUI interfaces. The render part of pipeline allows you to set up cameras, draw order and link to camera position/rotation etc automaticly. If you have 3dsmax I'd recommend playing with that. If not then the other methods are sound, just not as straight forward. Allthough saying that you will learn something doing it the hard way too (as always) |
| ||
| No, I can't afford 3d max.. I wish but way to expensive for me.. And I'm not the type that does cracks or warez or whatever else they call it. When I do something, I want it to be original and legal, so then I don't have bad feelings for what I did if I did do something wrong. Unfortunately, I spent a good half hour to an hour trying to get the double render to work and I couldn't get it. Here's my code if you guys can try to get it working.. Graphics3D 800,600, 0, 1
SetBuffer BackBuffer()
Const PLAYER_COL= 1
Const LEVEL_COL = 2
Const ENEMY_COL = 3
Const BULLET_COL= 4
sky = CreateSkyBox()
Type bullettype
Field entityhandle
End Type
Type badguytype ;set up the badguy type
Field entityhandle ;will contain the handle of the badguys mesh
Field state ;will contain the state that the badguy is currently in
End Type
light = CreateLight() ;Create a light to see
RotateEntity light, 30, 30, 0 ;angle the light
player = CreatePivot() ;A simple pivot is all we need to represent the player
camera = CreateCamera(player) ;create the camera and attach it to the player
level = LoadMesh("town.3ds") ;load in the level mesh
weapon1 = LoadMesh("glock.b3d", camera2) ;load in the weapon mesh and attach it to the camera
;ScaleEntity = weapon1 .5,.5,.5
;weapon1 = CreateCylinder(32, 1, camera):RotateMesh weapon1, 90, 0, 0:ScaleEntity weapon1, .05, .05, .2:EntityColor weapon1, 50, 50, 50
;bulletmesh = LoadMesh("bullet.b3d") ;load in a bullet mesh (this will be a template mesh)
bulletmesh = CreateCone():RotateMesh bulletmesh,90,0,0:ScaleEntity bulletmesh,.1,.1,.1
EntityType bulletmesh, BULLET_COL ;set up collision type for the bullet
EntityRadius bulletmesh, .01 ;set up collision radius for the bullet
;badguymesh = LoadMesh("badguy.b3d") ;load in badguy mesh (this will also be a template mesh)
badguymesh = CreateCylinder():ScaleEntity badguymesh,.3,.95,.125;.6 wide, 1.9 tall, .25 thick
EntityType badguymesh, ENEMY_COL ;set up collision type for the badguy
EntityRadius badguymesh, .3, .95 ;set up collision radius for the badguy (1.9 meters tall, .6 meters wide)
HideEntity bulletmesh ;hide the template meshes since they are not actual objects
HideEntity badguymesh ;this will also exclude them from collisions
For iter = 1 To 10 ;create some badguys from the template badguy mesh
badguy.badguytype = New badguytype ;create a new badguy
badguy\entityhandle = CopyEntity(badguymesh) ;give him a mesh
badguy\state = Rnd(1, 2) ;1=Guard 2=Search 3=Evade 4=Attack 5=Dead
Next
MoveEntity camera2, 0, .9, 0 ;move camera up to height of players head (also moves weapon)
MoveEntity weapon1, .1, -.15, .1 ;move weapon to bottom right of camera
MoveEntity player, 20, 3, -20 ;move the player to the starting position
For badguy = Each badguytype ;iterate through all of the badguys
PositionEntity badguy\entityhandle, Rnd(100)-50, .95, Rnd(100)-50 ;move the badguy to a random starting position
Next
EntityType player, PLAYER_COL ;set up collision type for the player
EntityRadius player, .3, 2 ;set up the players collision radius (1.9 meters tall, .6 meters wide)
EntityType level, LEVEL_COL ;set up collision type for the level
Collisions PLAYER_COL, LEVEL_COL, 2, 2 ;player to level
Collisions PLAYER_COL, ENEMY_COL, 1, 2 ;player to badguy
Collisions ENEMY_COL, LEVEL_COL, 2, 2 ;badguy to level
Collisions BULLET_COL, LEVEL_COL, 2, 1 ;bullet to level
Collisions BULLET_COL, ENEMY_COL, 2, 1 ;bullet to badguy
While Not KeyHit(1) ;ESC key
wkey = KeyDown(17) ;collect user input
skey = KeyDown(31) ;It's a good practice to collect these inputs only once
akey = KeyDown(30) ;per loop. This will prevent odd behaviors from happening,
dkey = KeyDown(32) ;for instance if the state of a key changes between multiple
spacekey = KeyDown(57)
mouse1 = MouseHit(1) ;checks of that key while still in the same loop.
If wkey Then MoveEntity player, 0, 0, .1 ;Forward - w key
If skey Then MoveEntity player, 0, 0, -.1 ;Back - s key
If akey Then MoveEntity player, -.1, 0, 0 ;Left - a key
If dkey Then MoveEntity player, .1, 0, 0 ;Right - d key
If spacekey Then MoveEntity player, 0, .8, 0
TurnEntity player, 0, -MouseXSpeed()/5.0, 0
TurnEntity camera, MouseYSpeed()/5.0, 0, 0
If EntityPitch(camera) < -45 ;don't allow camera to look below -45 degrees
RotateEntity camera, -45, EntityYaw(camera), EntityRoll(camera)
EndIf
If EntityPitch(camera) > 45 ;don't allow camera to look above 45 degrees
RotateEntity camera, 45, EntityYaw(camera), EntityRoll(camera)
EndIf
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2 ;reset mouse position to middle of screen
TranslateEntity player, 0, -.1, 0 ;simple gravity
If mouse1 ;check if left mouse button was pressed
bullet.bullettype = New bullettype ;create a bullet
bullet\entityhandle = CopyEntity(bulletmesh) ;create the bullet mesh
PositionEntity bullet\entityhandle, EntityX(weapon1, 1), EntityY(weapon1, 1), EntityZ(weapon1, 1) ;place the bullet at the guns position
RotateEntity bullet\entityhandle, EntityPitch(weapon1, 1), EntityYaw(weapon1, 1), EntityRoll(weapon1, 1);orientate the bullet with the gun
ResetEntity bullet\entityhandle ;otherwise bullet could hit enemy while moving from 0,0,0 to current position
EndIf
For thisbullet.bullettype = Each bullettype ;iterate through all of the bullets
MoveEntity thisbullet\entityhandle, 0, 0, 2 ;move the bullet forward along the bullets Z axis
If Abs(EntityX(thisbullet\entityhandle, 1)) > 10000 ;check if the bullet is way out of bounds
FreeEntity thisbullet\entityhandle ;delete the bullet mesh
Delete thisbullet ;delete the bullet
ElseIf Abs(EntityY(thisbullet\entityhandle, 1)) > 10000 ;check if the bullet is way out of bounds
FreeEntity thisbullet\entityhandle ;delete the bullet mesh
Delete thisbullet ;delete the bullet
ElseIf Abs(EntityZ(thisbullet\entityhandle, 1)) > 10000 ;check if the bullet is way out of bounds
FreeEntity thisbullet\entityhandle ;delete the bullet mesh
Delete thisbullet ;delete the bullet
EndIf
Next
UpdateWorld ;figures out collisions
For thisbullet = Each bullettype ;iterate through all of the bullets
If CountCollisions(thisbullet\entityhandle) > 0 ;check if bullet collided with something
enemyhit = EntityCollided(thisbullet\entityhandle, 3) ;note which enemy bullet collided with (if any)
If enemyhit > 0 ;enemyhit contains entity handle of enemy that was hit
For thisbadguy.badguytype = Each badguytype ;iterate through all of the badguys
If enemyhit = thisbadguy\entityhandle ;check if the enemy hit = this badguy
If thisbadguy\state <> 5 ;check if badguy is alive
thisbadguy\state = 5 ;dead ;make him dead
RotateEntity thisbadguy\entityhandle, 90, 0, 0 ;make him horizontal
EntityType thisbadguy\entityhandle, 0 ;turn off collisions for this badguy
TranslateEntity thisbadguy\entityhandle, 0, -.9, 0;set him on the ground
Exit ;exits the badguy For-Next loop (no need to check rest of badguys)
EndIf
EndIf
Next
EndIf
FreeEntity thisbullet\entityhandle ;delete the bullet mesh
Delete thisbullet ;delete the bullet
EndIf
Next
RenderWorld ;draws the 3d scene
Flip ;displays the scene to the screen
Wend ;loop until the ESC key is pressed
Function CreateCamera(weapon1)
; -- Setup HUD camera
camera2 = CreateCamera(weapon1)
PositionEntity camera2, 0.0, -500.0, 0.0
CameraRange camera2, 0.9, 5.0
CameraZoom camera2, 1.6
CameraClsMode camera2, False, True
EntityOrder camera2, -1
End Function
Function CreateSkyBox()
mesh = CreateMesh()
;front face
brush = LoadBrush("C:\Documents and Settings\user\Desktop\Soldiers Helmet\Skybox\front6.jpg",49)
surface = CreateSurface(mesh,brush)
AddVertex surface,-1,+1,-1,0,0
AddVertex surface,+1,+1,-1,1,0
AddVertex surface,+1,-1,-1,1,1
AddVertex surface,-1,-1,-1,0,1
AddTriangle surface,0,1,2
AddTriangle surface,0,2,3
FreeBrush brush
;left face
brush = LoadBrush("C:\Documents and Settings\user\Desktop\Soldiers Helmet\Skybox\left6.jpg",49)
surface = CreateSurface(mesh,brush)
AddVertex surface,+1,+1,-1,0,0
AddVertex surface,+1,+1,+1,1,0
AddVertex surface,+1,-1,+1,1,1
AddVertex surface,+1,-1,-1,0,1
AddTriangle surface,0,1,2
AddTriangle surface,0,2,3
FreeBrush brush
;back face
brush = LoadBrush("C:\Documents and Settings\user\Desktop\Soldiers Helmet\Skybox\back6.jpg",49)
surface = CreateSurface(mesh,brush)
AddVertex surface,+1,+1,+1,0,0
AddVertex surface,-1,+1,+1,1,0
AddVertex surface,-1,-1,+1,1,1
AddVertex surface,+1,-1,+1,0,1
AddTriangle surface,0,1,2
AddTriangle surface,0,2,3
FreeBrush brush
;right face
brush = LoadBrush("C:\Documents and Settings\user\Desktop\Soldiers Helmet\Skybox\right6.jpg",49)
surface = CreateSurface(mesh,brush)
AddVertex surface,-1,+1,+1,0,0
AddVertex surface,-1,+1,-1,1,0
AddVertex surface,-1,-1,-1,1,1
AddVertex surface,-1,-1,+1,0,1
AddTriangle surface,0,1,2
AddTriangle surface,0,2,3
FreeBrush brush
;top face
brush = LoadBrush("C:\Documents and Settings\user\Desktop\Soldiers Helmet\Skybox\top6.jpg",49)
surface = CreateSurface(mesh,brush)
AddVertex surface,-1,+1,+1,0,1
AddVertex surface,+1,+1,+1,0,0
AddVertex surface,+1,+1,-1,1,0
AddVertex surface,-1,+1,-1,1,1
AddTriangle surface,0,1,2
AddTriangle surface,0,2,3
FreeBrush brush
;bottom face
brush = LoadBrush("C:\Documents and Settings\user\Desktop\Soldiers Helmet\Skybox\bottom6.jpg",49)
surface = CreateSurface(mesh,brush)
AddVertex surface,-1,-1,-1,1,0
AddVertex surface,+1,-1,-1,1,1
AddVertex surface,+1,-1,+1,0,1
AddVertex surface,-1,-1,+1,0,0
AddTriangle surface,0,1,2
AddTriangle surface,0,2,3
FreeBrush brush
ScaleMesh mesh,200,200,200
FlipMesh mesh
EntityFX mesh,1 ; make fullbright
Return mesh
End Function |