Assigning textures to a cube ?
Blitz3D Forums/Blitz3D Beginners Area/Assigning textures to a cube ?
| ||
| I want to create a cube (with CreateCube()) and assign each side of it with a different texture. I could not find an example for this. Thanks for any help |
| ||
I tackled this using some code by Birdie that makes a segmented cube rather than straightforward CreateCube().
Graphics3D 800, 600
Global burn = LoadAnimTexture("burnhole.jpg", 2, 128, 128, 0, 8)
Global raze = LoadAnimTexture("raze.jpg",2, 128, 128, 0, 8)
Global burnbrush = CreateBrush()
Global razebrush = CreateBrush()
BrushTexture burnbrush, burn, 0
BrushTexture razebrush, raze, 0
Global cam = CreateCamera()
PositionEntity cam, 0,8,-15
Global light = CreateLight()
Global cube = create_scube();CreateCube()
PositionEntity cube, 0, -2, 10
PositionEntity light, 10, 40, -20
Repeat
SeedRnd(MilliSecs())
For ii = 1 To 20
CreateBurningCube()
Next
While Not KeyHit(1)
Delay 100
UpdateBurningCube()
RenderWorld
Flip
Wend
WaitKey
For ditch.BurningCube = Each BurningCube
Delete ditch
Next
Until MouseHit(1)
End
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Type BurningCube
Field itsmesh
Field x
Field y
Field z
Field lifetime
End Type
;==================================================================================
Function CreateBurningCube()
newcube.BurningCube = New BurningCube
newcube\x = Rnd(20)-10
newcube\y = Rnd(20)-10
newcube\z = Rnd(20)-10
newcube\itsmesh = create_scube()
PositionEntity newcube\itsmesh, newcube\x, newcube\y, newcube\z
newcube\lifetime = 24 + Rnd(500)
End Function
;==================================================================================
Function UpdateBurningCube()
For acube.BurningCube = Each BurningCube
Select True
Case acube\lifetime > 15 ; burn the top
If acube\lifetime < 25 Then
burningbrush = CreateBrush()
BrushTexture burningbrush, burn, 23 - acube\lifetime
surf = GetSurface(acube\itsmesh, 5)
PaintSurface surf, burningbrush
FreeBrush burningbrush
EndIf
Case acube\lifetime = 15
black = CreateBrush (0,0,0)
;BrushBlend black, 1
BrushAlpha black, 0
surf = GetSurface(acube\itsmesh, 5)
PaintSurface surf, black
FreeBrush black
Case acube\lifetime = 8
black = CreateBrush (0,0,0)
BrushAlpha black, 0
For s = 1 To 4
surf = GetSurface(acube\itsmesh, s)
PaintSurface surf, black
Next
FreeBrush black
Case acube\lifetime < 8 ; burn the bottom
Case acube\lifetime = 0
FreeEntity acube\itsmesh
Default
razingbrush = CreateBrush()
BrushTexture razingbrush, raze, 15 - acube\lifetime
For s = 1 To 4
surf = GetSurface(acube\itsmesh, s)
PaintSurface surf, razingbrush
Next
End Select
If acube\lifetime > 0 Then
acube\lifetime = acube\lifetime - 1
EndIf
Next
End Function
;==================================================================================
Function create_scube() ; original code by Birdie
Local cmesh,surf,v0,v1,v2,v3
cmesh=CreateMesh()
surf=CreateSurface(cmesh)
v0=AddVertex(surf,-1,1,-1,0,0)
v1=AddVertex(surf,1,1,-1,1,0)
v2=AddVertex(surf,-1,-1,-1,0,1)
v3=AddVertex(surf,1,-1,-1,1,1)
AddTriangle surf,v0,v1,v2
AddTriangle surf,v1,v3,v2
surf=CreateSurface(cmesh)
v0=AddVertex(surf,-1,1,1,0,0)
v1=AddVertex(surf,-1,1,-1,1,0)
v2=AddVertex(surf,-1,-1,1,0,1)
v3=AddVertex(surf,-1,-1,-1,1,1)
AddTriangle surf,v0,v1,v2
AddTriangle surf,v1,v3,v2
surf=CreateSurface(cmesh)
v0=AddVertex(surf,1,1,1,0,0)
v1=AddVertex(surf,-1,1,1,1,0)
v2=AddVertex(surf,1,-1,1,0,1)
v3=AddVertex(surf,-1,-1,1,1,1)
AddTriangle surf,v0,v1,v2
AddTriangle surf,v1,v3,v2
surf=CreateSurface(cmesh)
v0=AddVertex(surf,1,1,-1,0,0)
v1=AddVertex(surf,1,1,1,1,0)
v2=AddVertex(surf,1,-1,-1,0,1)
v3=AddVertex(surf,1,-1,1,1,1)
AddTriangle surf,v0,v1,v2
AddTriangle surf,v1,v3,v2
surf=CreateSurface(cmesh)
v0=AddVertex(surf,-1,1,1,0,0)
v1=AddVertex(surf,1,1,1,1,0)
v2=AddVertex(surf,-1,1,-1,0,1)
v3=AddVertex(surf,1,1,-1,1,1)
AddTriangle surf,v0,v1,v2
AddTriangle surf,v1,v3,v2
surf=CreateSurface(cmesh)
v0=AddVertex(surf,-1,-1,-1,0,0)
v1=AddVertex(surf,1,-1,-1,1,0)
v2=AddVertex(surf,-1,-1,1,0,1)
v3=AddVertex(surf,1,-1,1,1,1)
AddTriangle surf,v0,v1,v2
AddTriangle surf,v1,v3,v2
UpdateNormals cmesh
Return cmesh
End Function
You can use these animstrips that are referenced in the code... [img http:\\www.blackjumper.com\selling\burnhole.jpg] [img http:\\www.blackjumper.com\selling\raze.jpg] |
| ||
| Isnt there a easier way ? If it isnt, its better designing and skinning a cube in milkshape. |
| ||
| Yes, you would be. :) Alternatively you could create a single texture with 6 textures in it, then use the VertexCoords commands to assign a different part of the image to each set of triangles and .. No wait - even that you couldn't do as each corner is comprised of one vertex, not three. So yeah - impossible to do with CreateCube() >_< |
| ||
| even that you couldn't do as each corner is comprised of one vertex, not three. Not true. CreateCube() creates a cube made up of six independant (unwelded) quads. This is needed to get the lighting right. If the corners were all sharing a single vertex, the cube lighting would be smoothed and look wrong. You can see the difference by using UpdateNormals - which smoothes the normals - on a cube. |
| ||
OK, well maybe this will help...; Paints a CreateCube() with different colours ; coded by BlackJumper Graphics3D 640,480 SetBuffer BackBuffer() Global camera=CreateCamera() light=CreateLight() RotateEntity light,90,0,0 PositionEntity camera, 0, 0, -10 thecube = MakeCube() While Not KeyDown( 1 ) TurnEntity thecube, 1,1,1 RenderWorld Flip Wend End ;==================================================================================================== Function MakeCube() shape = CreateCube() EntityFX shape, 2 ; DebugLog "childern of cube = " + CountChildren(shape) ; For kids = 1 To CountChildren(shape) ; DebugLog "childern of cube = " + CountChildren(shape) ; kidshape = GetChild(shape, kids) ; For n = 1 To CountSurfaces(kids) ; DebugLog n ; surf = GetSurface(kidshape, n) ; DebugLog "triangles in prism = " + CountTriangles(surf) ; VertexColor surf, n, 255,0,0 ; Next ; Next ; DebugLog "surfaces of cube = " + CountSurfaces(shape) For n = 1 To CountSurfaces(shape) surf = GetSurface(shape, n) ; DebugLog n + " number vertices = " + CountVertices(surf) verts = CountVertices(surf) For v = 1 To CountVertices(surf) VertexColor surf, v, 255-(255.0/verts)*v,Abs((255.0/verts)*v-128),(255.0/verts)*v Next Next UpdateNormals shape Return shape End Function ;==================================================================================================== .... shows how to access individual faces (sortof) |
| ||
| Or, just create your own cube :o) Look for skybox code in the archives. The function creates a cube, with 6 surfaces. |
| ||
| This is simply what "jwe" wants. Just replace the texture names with the ones you want to use
; Skybox example
; for the Skybox with Terragen tutorial
; 27th of Feb 2002
;
; Tracer
;
; modified by "puki" - Oct 2005
Graphics3D 640,480
cam = CreateCamera()
PositionEntity cam,0,0,-5
light = CreateLight()
cube = create_cubebox()
While Not KeyDown(1)
TurnEntity cube,1,1,1
RenderWorld
Flip
Wend
Function create_cubebox()
mesh = CreateMesh()
;front face
brush = LoadBrush("front.bmp",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("right.bmp",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("back.bmp",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("left.bmp",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("top.bmp",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("bottom.bmp",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
EntityFX mesh,1 ; make fullbright
Return mesh
End Function
|
| ||
| Thanks a lot, it was more complicated than i thought. |