Code archives/3D Graphics - Mesh/CreateMyCylinder [updated:2004-2-19]

This code has been declared by its author to be Public Domain code.

Download source code

CreateMyCylinder [updated:2004-2-19] by Pepsi2003
a CreateCylinder blitz-like function. Does the Same thing with added ring segment parameter. Just wanted to do this to see how to actaully create a cylinder with the addvertex/addtriangle commands. Just thought I would share.
; CreateMyCylinder Example
; ----------------------
; By: Todd Riggins 12-22-2003
;
; a CreateCylinder blitz-like function. Does the Same thing. Just wanted to do
; this to see how to actaully create a cylinder with the addvertex/addtriangle
; commands. Just thought I would share.

; -----------------
; 2004-2-19 1:10:00
; - Added ring segments. Ring Segment param of zero acts like the
;    blitz-like Function. IE: no ring segments.
; - The added ring segments adds vertices to help bend cylinder tunnels or angle
;    pipe meshs. Ofcoarse, you will need to add your own code to manipulate the
;    cylinder's vertices.
; 2004-2-18 21:00:00
; - Fixed normal vectors problem: Needed to have cylinder ends as seperate surface
;
; Left sphere is created by the CreateMyCylinder function.
; Right sphere is created by blitz's CreateCylinder command.
;
; Controls:
; - Use mouse to rotate the cylinders
; - wireframe toggle 
; - Esc key to escape

; rediminsionable arrays
Dim tRing(0)
Dim bRing(0)

Graphics3D 640,480
SetBuffer BackBuffer()

camera=CreateCamera()

light=CreateLight()
RotateEntity light,90,0,0

;columngrid=LoadTexture("grid.bmp",9)

; enter how many segments the sphere has
vsegs=32
rsegs=4

; Create Blitz Cylinder
Cylinder=CreateCylinder(vsegs,True,0)
PositionEntity cylinder,1,0,4
;EntityTexture cylinder,columngrid

; Create Cylinder manually
mycylinder=CreateMyCylinder(vsegs,rsegs,True,0)
PositionEntity mycylinder,-1,0,4
;EntityTexture mycylinder,columngrid

; key helper
wkey=0

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

While Not KeyDown( 1 )

	mspx#=MouseXSpeed()
	mspy#=MouseYSpeed()

	If KeyDown(17) And wkey=0
		wkey=1
	EndIf

	If KeyDown(17)=False And wkey=1
		wkey=0
		If wframe=0
			wframe=1
		Else
			wframe=0
		EndIf
		If wframe=0 WireFrame False
		If wframe=1 WireFrame True
	EndIf


	MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
	TurnEntity cylinder,0,0,mspx#
	TurnEntity cylinder,mspy#,0,0

	TurnEntity mycylinder,0,0,mspx#
	TurnEntity mycylinder,mspy#,0,0

	RenderWorld
	Flip
Wend

End

; ---------------------------------------------------------
Function CreateMyCylinder(verticalsegments,ringsegments=0,solid=True,parent=0)
	Local tr,tl,br,bl; 		side of cylinder
	Local ts0,ts1,newts; 	top side vertexs
	Local bs0,bs1,newbs; 	bottom side vertexs
	If verticalsegments<3 Or verticalsegments>100 Then Return 0
	If ringsegments<0 Or ringsegments>100 Then Return 0
	
	thiscylinder=CreateMesh(parent)
	thissurf=CreateSurface(thiscylinder)
	If solid=True
		thissidesurf=CreateSurface(thiscylinder)
	EndIf
	div#=Float(360.0/(verticalsegments))

	height#=1.0
	ringSegmentHeight#=(height#*2.0)/(ringsegments+1)
	upos#=1.0
	udiv#=Float(1.0/(verticalsegments))
	vpos#=1.0
	vdiv#=Float(1.0/(ringsegments+1))

	SideRotAngle#=90

	; re-diminsion arrays to hold needed memory.
	; this is used just for helping to build the ring segments...
	Dim tRing(verticalsegments)
	Dim bRing(verticalsegments)
	
	;render end caps if solid
	If solid=True
		XPos#=-Cos(SideRotAngle#)
		ZPos#=Sin(SideRotAngle#)

		ts0=AddVertex(thissidesurf,XPos#,height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)
		bs0=AddVertex(thissidesurf,XPos#,-height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)

		SideRotAngle#=SideRotAngle#+div#

		XPos#=-Cos(SideRotAngle#)
		ZPos#=Sin(SideRotAngle#)
		
		ts1=AddVertex(thissidesurf,XPos#,height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)
		bs1=AddVertex(thissidesurf,XPos#,-height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)
		
		For i=1 To (verticalsegments-2)
			SideRotAngle#=SideRotAngle#+div#

			XPos#=-Cos(SideRotAngle#)
			ZPos#=Sin(SideRotAngle#)
			
			newts=AddVertex(thissidesurf,XPos#,height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)
			newbs=AddVertex(thissidesurf,XPos#,-height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)
			
			AddTriangle(thissidesurf,ts0,ts1,newts)
			AddTriangle(thissidesurf,newbs,bs1,bs0)
		
			If i<(verticalsegments-2)
				ts1=newts
				bs1=newbs
			EndIf
		Next
	EndIf
	
	; -----------------------
	; middle part of cylinder
	thisHeight#=height#
	
	; top ring first		
	SideRotAngle#=90
	XPos#=-Cos(SideRotAngle#)
	ZPos#=Sin(SideRotAngle#)
	thisUPos#=upos#
	thisVPos#=0
	tRing(0)=AddVertex(thissurf,XPos#,thisHeight,ZPos#,thisUPos#,thisVPos#)
	For i=0 To (verticalsegments-1)
		SideRotAngle#=SideRotAngle#+div#
		XPos#=-Cos(SideRotAngle#)
		ZPos#=Sin(SideRotAngle#)
		thisUPos#=thisUPos#-udiv#
		tRing(i+1)=AddVertex(thissurf,XPos#,thisHeight,ZPos#,thisUPos#,thisVPos#)
	Next	
	
	For ring=0 To (ringsegments)

		; decrement vertical segment
		thisHeight=thisHeight-ringSegmentHeight#
		
		; now bottom ring
		SideRotAngle#=90
		XPos#=-Cos(SideRotAngle#)
		ZPos#=Sin(SideRotAngle#)
		thisUPos#=upos#
		thisVPos#=thisVPos#+vdiv#
		bRing(0)=AddVertex(thissurf,XPos#,thisHeight,ZPos#,thisUPos#,thisVPos#)
		For i=0 To (verticalsegments-1)
			SideRotAngle#=SideRotAngle#+div#
			XPos#=-Cos(SideRotAngle#)
			ZPos#=Sin(SideRotAngle#)
			thisUPos#=thisUPos#-udiv#
			bRing(i+1)=AddVertex(thissurf,XPos#,thisHeight,ZPos#,thisUPos#,thisVPos#)
		Next
		
		; Fill in ring segment sides with triangles
		For v=1 To (verticalsegments)
			tl=tRing(v)
			tr=tRing(v-1)
			bl=bRing(v)
			br=bRing(v-1)
			
			AddTriangle(thissurf,tl,tr,br)
			AddTriangle(thissurf,bl,tl,br)
		Next
		
		; make bottom ring segmentthe top ring segment for the next loop.
		For v=0 To (verticalsegments)
			tRing(v)=bRing(v)
		Next		
	Next
			
	UpdateNormals thiscylinder 
	Return thiscylinder 
End Function

Comments

None.

Code Archives Forum