Code archives/3D Graphics - Mesh/CreateMyCone [Updated:2004-2-18]
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| A CreateCone blitz-like function. Does the Same thing. Just wanted to do this to see how to actaully create a cone with the addvertex/addtriangle commands. Just thought I would share. | |||||
; CreateMyCone Example
; ----------------------
; By: Todd Riggins 12-22-2003
;
; a CreateCone blitz-like function. Does the Same thing. Just wanted to do
; this to see how to actaully create a sphere with the addvertex/addtriangle
; commands. Just thought I would share.
;
; -------
; 2004-2-18 21:00:00
; Fixed normal vectors problem: Needed to have cone end as seperate surface.
; The blitz CreateCone function smooth shades the edge from the sides and
; end face making it look less like a cone. My version clearly shows the
; end face as it should be in reality, like a cone.
; Left sphere is created by the CreateMyCone function.
; Right sphere is created by blitz's CreateCone command.
;
; Controls:
; - Use mouse to rotate the cones
; - wireframe toggle
; - Esc key to escape
Graphics3D 640,480
SetBuffer BackBuffer()
camera=CreateCamera()
light=CreateLight()
RotateEntity light,90,0,0
;tex=LoadTexture("grid.bmp",9)
; enter how many segments the sphere has
segs=32
; Create Blitz Cone
cone=CreateCone(segs)
PositionEntity cone,1,0,4
;EntityTexture cone,tex
; Create Cone manually
mycone=CreateMyCone(segs)
PositionEntity mycone,-1,0,4
;EntityTexture mycone,tex
; 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 cone,0,0,mspx#
TurnEntity cone,mspy#,0,0
TurnEntity mycone,0,0,mspx#
TurnEntity mycone,mspy#,0,0
RenderWorld
Flip
Wend
End
; ---------------------------------------------------------
Function CreateMyCone(segments,solid=True,parent=0)
Local top,br,bl; side of cone
Local bs0,bs1,newbs; bottom side vertices
If segments<3 Or segments>100 Then Return 0
thiscone=CreateMesh(parent)
thissurf=CreateSurface(thiscone)
If solid=True
thissidesurf=CreateSurface(thiscone)
EndIf
div#=Float(360.0/(segments))
height#=1.0
upos#=1.0
udiv#=Float(1.0/(segments))
RotAngle#=90
; first side
XPos#=-Cos(RotAngle#)
ZPos#=Sin(RotAngle#)
top=AddVertex(thissurf,0.0,height,0.0,upos#-(udiv#/2.0),0)
br=AddVertex(thissurf,XPos#,-height,ZPos#,upos#,1)
If solid=True Then bs0=AddVertex(thissidesurf,XPos#,-height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)
RotAngle#=RotAngle#+div#
XPos#=-Cos(RotAngle#)
ZPos#=Sin(RotAngle#)
bl=AddVertex(thissurf,XPos#,-height,ZPos#,upos#-udiv#,1)
If solid=True Then bs1=AddVertex(thissidesurf,XPos#,-height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)
AddTriangle(thissurf,bl,top,br)
; rest of sides
For i=1 To (segments-1)
br=bl
upos#=upos#-udiv#
top=AddVertex(thissurf,0.0,height,0.0,upos#-(udiv#/2.0),0)
RotAngle#=RotAngle#+div#
XPos#=-Cos(RotAngle#)
ZPos#=Sin(RotAngle#)
bl=AddVertex(thissurf,XPos#,-height,ZPos#,upos#-udiv#,1)
If solid=True Then newbs=AddVertex(thissidesurf,XPos#,-height,ZPos#,XPos#/2.0+0.5,ZPos#/2.0+0.5)
AddTriangle(thissurf,bl,top,br)
If solid=True
AddTriangle(thissidesurf,newbs,bs1,bs0)
If i<(segments-1)
bs1=newbs
EndIf
EndIf
Next
UpdateNormals thiscone
Return thiscone
End Function |
Comments
| ||
| very nice |
Code Archives Forum