def QuadWireframe(egg): def RecursePoly(node, geo): if isinstance(node, pm.EggPolygon): # Get each vert position poss = [] for vert in node.getVertices(): pos3 = vert.getPos3() pos = pm.Point3(pos3.getX(), pos3.getY(), pos3.getZ()) poss.append(pos) # Build lines geo.combineWith(Line(poss[0], poss[1])) geo.combineWith(Line(poss[1], poss[2])) geo.combineWith(Line(poss[2], poss[3])) geo.combineWith(Line(poss[3], poss[0])) # Recurse down hierarchy if hasattr(node, 'getChildren'): for child in node.getChildren(): RecursePoly(child, geo) return geo return RecursePoly(egg, pm.GeomNode('quadWireframe'))
def Box(width=1, depth=1, height=1, origin=pm.Point3(0, 0, 0)): """Return a geom node representing a box.""" # Create vetex data format gvf = pm.GeomVertexFormat.getV3n3() gvd = pm.GeomVertexData('vertexData', gvf, pm.Geom.UHStatic) # Create vetex writers for each type of data we are going to store gvwV = pm.GeomVertexWriter(gvd, 'vertex') gvwN = pm.GeomVertexWriter(gvd, 'normal') # Write out all points for p in GetPointsForBox(width, depth, height): gvwV.addData3f(pm.Point3(p) - origin) # Write out all the normals for n in ((-1, 0, 0), (1, 0, 0), (0, -1, 0), (0, 1, 0), (0, 0, -1), (0, 0, 1)): for i in range(4): gvwN.addData3f(n) geom = pm.Geom(gvd) for i in range(0, gvwV.getWriteRow(), 4): # Create and add both triangles geom.addPrimitive(GetGeomTriangle(i, i + 1, i + 2)) geom.addPrimitive(GetGeomTriangle(i, i + 2, i + 3)) # Return the box GeomNode geomNode = pm.GeomNode('box') geomNode.addGeom(geom) return geomNode
def Cone(radius=1.0, height=2.0, numSegs=16, degrees=360, axis=pm.Vec3(0, 0, 1), origin=pm.Point3(0, 0, 0)): """Return a geom node representing a cone.""" # Create vetex data format gvf = pm.GeomVertexFormat.getV3n3() gvd = pm.GeomVertexData('vertexData', gvf, pm.Geom.UHStatic) # Create vetex writers for each type of data we are going to store gvwV = pm.GeomVertexWriter(gvd, 'vertex') gvwN = pm.GeomVertexWriter(gvd, 'normal') # Get the points for an arc axis2 = pm.Vec3(axis) axis2.normalize() offset = axis2 * height / 2.0 points = GetPointsForArc(degrees, numSegs, True) for i in range(len(points) - 1): # Rotate the points around the desired axis p1 = pm.Point3(points[i][0], points[i][1], 0) * radius p1 = RotatePoint3(p1, pm.Vec3(0, 0, 1), axis) - origin p2 = pm.Point3(points[i + 1][0], points[i + 1][1], 0) * radius p2 = RotatePoint3(p2, pm.Vec3(0, 0, 1), axis) - origin cross = (p2 - axis).cross(p1 - axis) cross.normalize() # Facet gvwV.addData3f(p1 - offset) gvwV.addData3f(offset - origin) gvwV.addData3f(p2 - offset) for i in range(3): gvwN.addData3f(cross) # Base gvwV.addData3f(p2 - offset) gvwV.addData3f(-offset - origin) gvwV.addData3f(p1 - offset) for i in range(3): gvwN.addData3f(-axis) geom = pm.Geom(gvd) for i in range(0, gvwV.getWriteRow(), 3): # Create and add triangle geom.addPrimitive(GetGeomTriangle(i, i + 1, i + 2)) # Return the cone GeomNode geomNode = pm.GeomNode('cone') geomNode.addGeom(geom) return geomNode
def __init__(self, points, normals=None, texcoords=None, origin=pm.Point3(0, 0, 0)): # Create vetex data format gvf = pm.GeomVertexFormat.getV3n3t2() gvd = pm.GeomVertexData('vertexData', gvf, pm.Geom.UHStatic) # Create vetex writers for each type of data we are going to store gvwV = pm.GeomVertexWriter(gvd, 'vertex') gvwN = pm.GeomVertexWriter(gvd, 'normal') gvwT = pm.GeomVertexWriter(gvd, 'texcoord') # Write out all points and normals for i, point in enumerate(points): p = pm.Point3(point) - origin gvwV.addData3f(p) # Calculate tex coords if none specified if texcoords is None: gvwT.addData2f(p.x / 10.0, p.y / 10.0) else: gvwT.addData2f(texcoords[i]) # Calculate normals if none specified if normals is None: prevPoint = (points[-1] if i == 0 else points[i - 1]) nextPoint = (points[0] if i == len(points) - 1 else points[i + 1]) cross = (nextPoint - point).cross(prevPoint - point) cross.normalize() gvwN.addData3f(cross) else: gvwN.addData3f(normals[i]) geom = pm.Geom(gvd) for i in range(len(points) - 1): # Create and add both triangles geom.addPrimitive(GetGeomTriangle(0, i, i + 1)) # Init the node path, wrapping the polygon geomNode = pm.GeomNode('poly') geomNode.addGeom(geom) pm.NodePath.__init__(self, geomNode)
def Sphere(radius=1.0, numSegs=16, degrees=360, axis=pm.Vec3(0, 0, 1), origin=pm.Point3(0, 0, 0)): """Return a geom node representing a cylinder.""" # Create vetex data format gvf = pm.GeomVertexFormat.getV3n3() gvd = pm.GeomVertexData('vertexData', gvf, pm.Geom.UHStatic) # Create vetex writers for each type of data we are going to store gvwV = pm.GeomVertexWriter(gvd, 'vertex') gvwN = pm.GeomVertexWriter(gvd, 'normal') # Get the points for an arc axis = pm.Vec3(axis) axis.normalize() points = GetPointsForArc(degrees, numSegs, True) zPoints = GetPointsForArc(180, numSegs / 2, True) for z in range(1, len(zPoints) - 2): rad1 = zPoints[z][1] * radius rad2 = zPoints[z + 1][1] * radius offset1 = axis * zPoints[z][0] * radius offset2 = axis * zPoints[z + 1][0] * radius for i in range(len(points) - 1): # Get points p1 = pm.Point3(points[i][0], points[i][1], 0) * rad1 p2 = pm.Point3(points[i + 1][0], points[i + 1][1], 0) * rad1 p3 = pm.Point3(points[i + 1][0], points[i + 1][1], 0) * rad2 p4 = pm.Point3(points[i][0], points[i][1], 0) * rad2 # Rotate the points around the desired axis p1, p2, p3, p4 = [ RotatePoint3(p, pm.Vec3(0, 0, 1), axis) for p in [p1, p2, p3, p4] ] a = p1 + offset1 - origin b = p2 + offset1 - origin c = p3 + offset2 - origin d = p4 + offset2 - origin # Quad gvwV.addData3f(d) gvwV.addData3f(b) gvwV.addData3f(a) gvwV.addData3f(d) gvwV.addData3f(c) gvwV.addData3f(b) # Normals cross = (b - c).cross(a - c) for i in range(6): gvwN.addData3f(cross) # Get points rad1 = zPoints[1][1] * radius for m in [1, -2]: offset1 = axis * zPoints[m][0] * radius clampedM = max(-1, min(m, 1)) * radius for i in range(len(points) - 1): p1 = pm.Point3(points[i][0], points[i][1], 0) * rad1 p2 = pm.Point3(points[i + 1][0], points[i + 1][1], 0) * rad1 # Rotate the points around the desired axis p1, p2 = [ RotatePoint3(p, pm.Vec3(0, 0, 1), axis) for p in [p1, p2] ] a = p1 + offset1 - origin b = p2 + offset1 - origin c = -axis * clampedM # Quad if clampedM > 0: gvwV.addData3f(a) gvwV.addData3f(b) gvwV.addData3f(c) else: gvwV.addData3f(c) gvwV.addData3f(b) gvwV.addData3f(a) # Normals cross = (b - c).cross(a - c) for i in range(3): gvwN.addData3f(cross * -m) geom = pm.Geom(gvd) for i in range(0, gvwV.getWriteRow(), 3): # Create and add triangle geom.addPrimitive(GetGeomTriangle(i, i + 1, i + 2)) # Return the cylinder GeomNode geomNode = pm.GeomNode('cylinder') geomNode.addGeom(geom) return geomNode