Notifications
Clear all

[Closed] half circle

well, i’m trying to make a primitive plugin. i tried modifying the antistar sun shape primitive into a full poly circle,
but only managed to get backfaces.

14 Replies
1 Reply
(@bobo)
Joined: 11 months ago

Posts: 0

Can you explain what you mean with “only backfaces”? Any face has a front and back. If you have got backfaces, you must have front faces on the other side! It just depends on the vertex order – counterclockwise gives you front, clockwise gives you the inverse…

Can you post any code?

radius1 = 100

radius2 = 10

width = 10

vert_array = #()

face_array = #()

vert_count = 0

num_faces = 10

for a = 0 to 360 by 360/num_faces do

(

v1 = [radius1cos(a+width),radius1sin(a+width),0]

v2 = [radius1cos(a-width),radius1sin(a-width),0]

v3 = [radius2cos(a),radius2sin(a),0]

append vert_array v1

append vert_array v2

append vert_array v3

append face_array [vert_count+1,vert_count+3,vert_count+2]

vert_count += 3

) m = mesh vertices:vert_array faces:face_array

well, this is the code i try to modify.

  1. is what i try to create, 2. is what this script creates
  2. is how i think i’ll make it.
    and 4 is how i want the final primitive.

i think making an edge from each of the middle vertices (radius2)
and then extruding that edge to the left and right by radius 1 will get me the result
i want. but i just have no idea how to make radius 2 into a single vertex located in the middle, or how to make faces inbetween those faces in the antistar.
i tried creating another face array, but it only created backfaces.

1 Reply
(@bobo)
Joined: 11 months ago

Posts: 0

I know, I wrote it

Here is what you need, with comments:


  radius1 = radius2 = 100 --both radii of the hemi-circles
  theHeight = 100 --the distance between the halves
  
  num_faces = 20 --number of segments per hemi-circle
  
  vert_array = #() --vertex array
  face_array = #() --face array
  
  center1 = [0,theHeight/2,0] --center of the first hemi-circle
  center2 = [0,-theHeight/2,0] --center of the second hemi-circle
  
  append vert_array center1 --add the center to the vertex array
  vert_count = 1 --init. the vertex counter to 1 
  
  theStep = 180.0/num_faces --the angle to increment to get N segments
  
  for a = 0 to 180-theStep by theStep do --loop through the segments of the first hemi-circle
  (
  append vert_array (center1 + [radius1*cos(a),radius1*sin(a),0]) --add first vertex on circle
  append vert_array (center1 + [radius1*cos(a+theStep),radius1*sin(a+theStep),0]) --add second circle + the angular offset
  append face_array [1 ,vert_count+1,vert_count+2] --define a face from center1 (vertex 1) and the two new vertices on the circle
  vert_count += 2 --add two because two new vertices were added
  )--end a loop
  
  append vert_array center2 --add the second center as vertex
  center2Index = vert_count += 1 --and remember its index 
  
  for a = 180 to 360-theStep by theStep do --same as above, but other half from 180 to 360-the step
  (
  append vert_array (center2 + [radius2*cos(a),radius2*sin(a),0]) --same as before, just using center2 and radius2
  append vert_array (center2 + [radius2*cos(a+theStep),radius2*sin(a+theStep),0]) --same as before
  append face_array [center2Index ,vert_count+1,vert_count+2] --connect the vertex at center2 with the two new verts
  vert_count += 2 --increase by 2 as before
  )--end a loop
  
 append face_array [center2Index ,vert_count, 2] --create a face from the center2 to the last vertex to the first vertex of first half-circle (index 2)
 append face_array [1, center2Index , 2] --create a face using first center, the second center and the first vertex of hemi circle 1
 append face_array [center2Index - 1, center2Index + 1, 1 ] --same with the last vertex of circle 1, the first vertex of circle2 and center 1
  append face_array [center2Index + 1, center2Index, 1 ] --and finally face from first vertex of circle2, center 2 and center 1
  
  m = mesh vertices:vert_array faces:face_array  --create the mesh...
  
  

Now just make it a scripted plugin and you are done

This update shows how to hide all the internal edges…

  radius1 = radius2 = 100 --both radii of the hemi-circles
  theHeight = 100 --the distance between the halves
  
  num_faces = 20 --number of segments per hemi-circle
  
  vert_array = #() --vertex array
  face_array = #() --face array
  edge_vis = #() --edge visibility
  
  center1 = [0,theHeight/2,0] --center of the first hemi-circle
  center2 = [0,-theHeight/2,0] --center of the second hemi-circle
  
  append vert_array center1 --add the center to the vertex array
  vert_count = 1 --init. the vertex counter to 1 
  
  theStep = 180.0/num_faces --the angle to increment to get N segments
  
  for a = 0 to 180-theStep by theStep do --loop through the segments of the first hemi-circle
  (
  append vert_array (center1 + [radius1*cos(a),radius1*sin(a),0]) --add first vertex on circle
  append vert_array (center1 + [radius1*cos(a+theStep),radius1*sin(a+theStep),0]) --add second circle + the angular offset
  append face_array [1 ,vert_count+1,vert_count+2] --define a face from center1 (vertex 1) and the two new vertices on the circle
  append edge_vis #(false,true,false) --make first and third edge invisible
  vert_count += 2 --add two because two new vertices were added
  )--end a loop
  
  append vert_array center2 --add the second center as vertex
  center2Index = vert_count += 1 --and remember its index 
  
  for a = 180 to 360-theStep by theStep do --same as above, but other half from 180 to 360-the step
  (
  append vert_array (center2 + [radius2*cos(a),radius2*sin(a),0]) --same as before, just using center2 and radius2
  append vert_array (center2 + [radius2*cos(a+theStep),radius2*sin(a+theStep),0]) --same as before
  append face_array [center2Index ,vert_count+1,vert_count+2] --connect the vertex at center2 with the two new verts
  append edge_vis #(false,true,false) --make first and third edge invisible
  vert_count += 2 --increase by 2 as before
  )--end a loop
  
  append face_array [center2Index ,vert_count, 2] --create a face from the center2 to the last vertex to the first vertex of first half-circle (index 2)
  append face_array [1, center2Index , 2] --create a face using first center, the second center and the first vertex of hemi circle 1
  append face_array [center2Index - 1, center2Index + 1, 1 ] --same with the last vertex of circle 1, the first vertex of circle2 and center 1
  append face_array [center2Index + 1, center2Index, 1 ] --and finally face from first vertex of circle2, center 2 and center 1

  append edge_vis #(false,true,false) --make first and third edges invisible
  append edge_vis #(false,false,false) --make all edges invisible
  append edge_vis #(true,false,false) --make second and third edges invisible
  append edge_vis #(false,false,false) --make all edges invisible
  
 m = mesh vertices:vert_array faces:face_array  --create the mesh...
 
 for i = 1 to edge_vis.count do  --go through all edge visibility arrays
  for j = 1 to 3 do  --loop from 1 to 3
	 setEdgeVis m i j edge_vis[i][j] --set the 3 edges of the current face (index same as i)
 update m --update the mesh

And because I cannot stop, here is the plugin.
If you want to do it yourself, stop reading

This will be most probably a new HowTo tutorial in the next MAXScript Reference update, if you don’t mind…


  plugin simpleObject ExtCircle
  name:"ExtCircle"
  category:"HowTo"
  classID:#(0xe855567d, 0xbcd73b8c)
  (
  
  parameters main rollout:params
  (
  num_faces type:#integer ui:num_faces default:10
  radius1 type:#float ui:radius1 default:0
  radius2 type:#float ui:radius2 default:0
  width type:#float ui:width default:1
  )
  
  rollout params "ExtCircle"
  (
  spinner num_faces "Segments" range:[2,100,10] type:#integer
  spinner radius1 "Radius 1" range:[0,10000,0]
  spinner radius2 "Radius 2" range:[0,10000,0]
  spinner width "Width" range:[0,90,1]
  )
  
  
  on buildMesh do
  (
  
   
    vert_array = #() --vertex array
    face_array = #() --face array
    edge_vis = #() --edge visibility
    
    center1 = [0,width/2,0] 
    center2 = [0,-width/2,0] 
    
    append vert_array center1 
    vert_count = 1 
    theStep = 180.0/num_faces 
    for a = 0 to 180-theStep by theStep do 
    (
    append vert_array (center1 + [radius1*cos(a),radius1*sin(a),0]) 
    append vert_array (center1 + [radius1*cos(a+theStep),radius1*sin(a+theStep),0]) 
    append face_array [1 ,vert_count+1,vert_count+2] 
    append edge_vis #(false,true,false) 
    vert_count += 2 
    )--end a loop
    
    append vert_array center2 
    center2Index = vert_count += 1 
    
    for a = 180 to 360-theStep by theStep do 
    (
    append vert_array (center2 + [radius2*cos(a),radius2*sin(a),0]) 
    append vert_array (center2 + [radius2*cos(a+theStep),radius2*sin(a+theStep),0]) 
    append face_array [center2Index ,vert_count+1,vert_count+2] 
    append edge_vis #(false,true,false) 
    vert_count += 2 
    )--end a loop
    
    append face_array [center2Index ,vert_count, 2] 
    append face_array [1, center2Index , 2] 
    append face_array [center2Index - 1, center2Index + 1, 1 ] 
    append face_array [center2Index + 1, center2Index, 1 ] 
    append edge_vis #(false,true,false) 
    append edge_vis #(false,false,false)
    append edge_vis #(true,false,false) 
    append edge_vis #(false,false,false)
    
   setMesh mesh vertices:vert_array faces:face_array  
   
   for i = 1 to edge_vis.count do  
    for j = 1 to 3 do  --loop from 1 to 3
  	 setEdgeVis mesh i j edge_vis[i][j] 
  	
  )--end buildMesh
  
  tool create
  (
  on mousePoint click do
  (
  case click of
  (
  1: coordsys grid (nodeTM.translation = gridPoint)
  )
  )
  
  on mouseMove click do
  (
  case click of
  (
  2: (radius1 = radius2 = abs(gridDist.y))
  3: (width = abs(gridDist.y))
  4: (#stop)
  )
  )
  
  )--end create
  )--end plugin
  
  

wow, that is fantastic! thanks a lot!
no i don’t mind you making this into a tutorial
i’ve been searching for a tutorial on how to create my own primitives for quite a while!

well, did some minor modifications,
i increased the middle width to 400,
and put it into standard primitives.
now my fingers burns after putting this into some heavy usage

later i’ll see if i can make one of the half circles disappear,
and make it 3 dimensional.
maybe make the edges chamferable.
and an option to create a standard circle.
or box. hehe.

well, just had to play around a bit with the code

here’s the result.
i added a little shape modifier code.
now trying to figure how to do it on the other side

well, now i tried modifying the plugin code. but it refuse to work.

plugin simpleObject ExtCircle

name:“ExtCircle”

category:“Standard Primitives”

classID:#(0xe855567d, 0xbcd73b8c)

(

parameters main rollout:params

(

num_faces type:#integer ui:num_faces default:10

radius1 type:#float ui:radius1 default:0

radius2 type:#float ui:radius2 default:0

width type:#float ui:width default:1

disturber type:#float ui:disturber default:1

)

rollout params “ExtCircle”

(

spinner num_faces “Segments” range:[2,100,10] type:#integer

spinner radius1 “Radius 1” range:[0,10000,0]

spinner radius2 “Radius 2” range:[0,10000,0]

spinner width “Width” range:[0,400,1]

spinner disturber “disturb” range:[0,80,0]

)

on buildMesh do

(

vert_array = #() –vertex array

face_array = #() –face array

edge_vis = #() –edge visibility

center1 = [0,width/2,0]

center2 = [0,-width/2,0]

append vert_array center1

vert_count = 1

theStep = 180.0/num_faces

disturber = 1

for a = 7-disturber to 180-theStep+disturber by theStep do

(

append vert_array (center1 + [radius1cos(a),radius1sin(a),0])

append vert_array (center1 + [radius1cos(a+theStep),radius1sin(a+theStep),0])

append face_array [1 ,vert_count+1,vert_count+2]

append edge_vis #(false,true,false)

vert_count += 2

)–end a loop

append vert_array center2

center2Index = vert_count += 1

for a = 180.4-disturber to 360-theStep+disturber by theStep do

(

append vert_array (center2 + [radius2cos(a),radius2sin(a),0])

append vert_array (center2 + [radius2cos(a+theStep),radius2sin(a+theStep),0])

append face_array [center2Index ,vert_count+1,vert_count+2]

append edge_vis #(false,true,false)

vert_count += 2

)–end a loop

append face_array [center2Index ,vert_count, 2]

append face_array [1, center2Index , 2]

append face_array [center2Index – 1, center2Index + 1, 1 ]

append face_array [center2Index + 1, center2Index, 1 ]

append edge_vis #(false,true,false)

append edge_vis #(false,false,false)

append edge_vis #(true,false,false)

append edge_vis #(false,false,false)

setMesh mesh vertices:vert_array faces:face_array

for i = 1 to edge_vis.count do

for j = 1 to 3 do–loop from 1 to 3

setEdgeVis mesh i j edge_vis[i][j]

)–end buildMesh

tool create

(

on mousePoint click do

(

case click of

(

1: coordsys grid (nodeTM.translation = gridPoint)

)

)

on mouseMove click do

(

case click of

(

2: (radius1 = radius2 = abs(gridDist.y))

3: (width = abs(gridDist.y))

4: (disturber = abs(gridDist.y))

5: (#stop)

)

)

)–end create

)–end plugin

hah, ok, i found why it went wrong

i should have replaced the number with the parameter.

here’s the final “bonecircle” script.

plugin simpleObject ExtCircle
name:“ExtCircle”

category:“Standard Primitives”

classID:#(0xe855567d, 0xbcd73b8c)

(

parameters main rollout:params

(

num_faces type:#integer ui:num_faces default:10

radius1 type:#float ui:radius1 default:0

radius2 type:#float ui:radius2 default:0

width type:#float ui:width default:1

disturb type:#float ui:disturb default:0

)

rollout params “ExtCircle”

(

spinner num_faces “Segments” range:[2,100,10] type:#integer

spinner radius1 “Radius 1” range:[0,10000,0]

spinner radius2 “Radius 2” range:[0,10000,0]

spinner width “Width” range:[0,400,1]

spinner disturb “disturber” range:[0,70,1]

)

on buildMesh do

(

vert_array = #() –vertex array

face_array = #() –face array

edge_vis = #() –edge visibility

center1 = [0,width/2,0]

center2 = [0,-width/2,0]

append vert_array center1

vert_count = 1

theStep = 180.0/num_faces

disturber = disturb

for a = 0-disturber to 180-theStep+disturber by theStep do

(

append vert_array (center1 + [radius1cos(a),radius1sin(a),0])

append vert_array (center1 + [radius1cos(a+theStep),radius1sin(a+theStep),0])

append face_array [1 ,vert_count+1,vert_count+2]

append edge_vis #(false,true,false)

vert_count += 2

)–end a loop

append vert_array center2

center2Index = vert_count += 1

for a = 180-disturber to 360-theStep+disturber by theStep do

(

append vert_array (center2 + [radius2cos(a),radius2sin(a),0])

append vert_array (center2 + [radius2cos(a+theStep),radius2sin(a+theStep),0])

append face_array [center2Index ,vert_count+1,vert_count+2]

append edge_vis #(false,true,false)

vert_count += 2

)–end a loop

append face_array [center2Index ,vert_count, 2]

append face_array [1, center2Index , 2]

append face_array [center2Index – 1, center2Index + 1, 1 ]

append face_array [center2Index + 1, center2Index, 1 ]

append edge_vis #(false,true,false)

append edge_vis #(false,false,false)

append edge_vis #(true,false,false)

append edge_vis #(false,false,false)

setMesh mesh vertices:vert_array faces:face_array

for i = 1 to edge_vis.count do

for j = 1 to 3 do–loop from 1 to 3

setEdgeVis mesh i j edge_vis[i][j]

)–end buildMesh

tool create

(

on mousePoint click do

(

case click of

(

1: coordsys grid (nodeTM.translation = gridPoint)

)

)

on mouseMove click do

(

case click of

(

2: (radius1 = radius2 = abs(gridDist.y))

3: (width = abs(gridDist.y))

4: (disturb = abs(gridDist.y))

5: (#stop)

)

)

)–end create

)–end plugin

Page 1 / 2