Vector controller performs vector operations on one or between two or three input vectors.

Vector Controller (710.0 KiB)

]]>

Blend controller takes two input and mix them using the third input (Blend amount). Below is the formula used in blend controller:

Blendcontroller (920.4 KiB)

]]>

This controller extract the RGB , HSV and Alpha values from a given bitmap (image) or procedural map or the vertex color channel of the mesh geometries

Bitmapcontroller (844.5 KiB)

]]>This controller returns some basic information about the array members and current scene states. Note that controller retrieve the information from the members of the first parent (container) node in a Paraflow.Also if the controller is used under Array Variable Override controller then the new values that are overwritten by the AVO will be returned. This controller can generate two types of output:

]]>

This controller extract information about Faces,Edges and Vertices of an Editable Mesh or Editable Poly object.

Meshcontroller (2.0 MiB)

]]>- Before we start , let me explain how Bitmap controller works. A Bitmap controller extract information from bitmaps and procedural maps. Maps are considered as 2D domain in which each point in the domain can be addressed by a 2D vector. Image below demonstrate bitmap that has been subdivided using an 18×18 domain.

- The Bitmap controller then create a table of the colors by finding the average color in each sample of the image.

- From this table we can now recall the value stored in each cell by having the vector position of that particular cell.

- Normally in each cell 7 values are stored that are corresponding to the Red,Green,Blue,Hue,Saturation,Value and Alpha of the sample. Each of these values can vary between o to 255. Once the value is retrieved it will be remapped to the out put range. for example if you choose -.1 and -2 for the Min and Max range , the output will be adjusted to the target range using a linear mapping technique.

So now we know that Bitmap controller works on 2D domain, but how do we provide a 2D domain ? If the controller was assigned to a parametric array with members in both dimension we could easily choose D1-D2 in dimension settings and map the array members to the bitmap. But in Edit-Poly node we have only one node as input. Even thinking about the faces of edit-poly , they are stored in 1D fashion and access to each face is provided by an integer number which we call it “face index”. The only way to create a 2d domain from the faces of an edit-poly ( in this case is a plane object) is to find the center point of the face in respect to the local coordinate system of the node. Here we have to parameter to build , first parameter is the center point of the face , well that’s the easy one ! we can use Mesh controller and the Face index for find the center point of the face. The face index can be extracted from Sub-object index channel of the Edit-Poly node.

- The second parameter is the local coordinate system of the given edit-poly object. You probably say that’s even easier, I can use Para link controller to retrieve the transform property of the object.

- well it’s only the first step. because when you retrieve the transform property , you can actually use it as local coordinate system, however, the transformation is given by considering the location of the pivot point in the object. In this case the origin of the local coordinate system will be in the middle and when we try to calculate the coordinates of the face center in respect to this system we will end up with negative numbers for X and Y coordinates in 3 quarter of the plane.(See Fig. A)

(Fig. A) (Fig. B)

- The negative numbers cannot work with Bitmap controller. The solution is either to push the origin of the coordinate system to the left-bottom corner of the plane or remap the numbers from the {-L/2,+L/2} to {0,L}.(See Fig. B)
- In this video I took the first approach. To push the origin of the local coordinate system we need to find the size of the plane in respect to its local coordinate system. Node controller is where you can find this information. The size of object bounding box along the local X and Y is the number we are looking for. I created to Node controller which can extract these information from the edit-poly object and rename them to X-range and Y-range.

- The origin point must be moved by half of the size of the plane. So I used the Math controller to multiply the outcome of the Node controllers by -.5 . Now we have the X and Y coordinate of a point which represent the coordinate of the left-bottom corner of the plane in it’s local coordinate system.

- To use these scalar values as coordinate system we need to convert them to transform matrix value. First we must create a vector using the two scalar value.

- Then we create a transitional matrix to convert the vector to a Transformation.

- Last step is to transform the transitional matrix by the plane transformation so that we can use it as coordinate system in the next transform controller.

- When you add a transformation to “coordinate system” channel of a
*transformation*controller the output represent the local coordinates of the initial value in the given coordinate system. So let’s assign the Face center which is found in global coordinate system to initial value and our transformation for left-bottom corner to coordinate system channel to find the center of the face in the newly created coordinate system. The output will be a vector with positive components varies between zero and X-range or Y-range respectively.

- Now we have computed the X and Y coordinates of the face center , how do we use this in Bitmap controller, there are no option to plug the X and Y to the controller. Bitmap controller works based on the indexes and counts of the parametric array. To inform the Bitmap controller about the X and Y value we need to override the indexes and counts. This can be done by using the Bitmap controller under a
.**Variable override controller**

- The C
*ount1*and*Count2*values are referring the to domain size in the first and second dimension, so we override them by X-range and Y-range from our Node controllers( remember that they are representing the size of the plane in respect to local X and Y axis) . The*Index1*and*Index2*value are referring to the location of member (in this case a Face) in respect to the given domain, so we override them by the X and Y which we calculated from above.

Everything is ready to go! give it a try. don’t forget to hide the original edit-poly to see the result. you can also add another edit-poly to remove the resulted faces.

Our problem is to populate a given structure on the surfaces of spline base cage. The first answer comes in mind is to use Para 3d surface controller, However, the given object does not work with surface-controller. In first glance it looks like a smooth surface but it also presents singularities in different points.In Para 3d a surface by definition means a 2D plane that has been deformed into 3d space. The given object actually composed of multiple surfaces as it is shown in below image

**Step 1 – Breaking big problem to smaller problems:**

Let’s start with breaking apart the object to multiple surfaces. I suggest use of NURBS surface. NURBS surfaces in 3ds MAX provides a normalized UV mapping that can be used to divide the surface uniformly. To build NURBS surface from the spline-cage I started with extracting the shapes that can form a loft surface. You can simply convert the Spline shapes to NURBS curve from right click menu. Notice that I left the segments with sharp corners. This is because the NUNRS CV curves cannot create sharp corners. Once the curves are extracted we can then create Loft surfaces from two or multiple curves. Switch off the display mesh of the NURBS object so that when you create the pattern you can see it clearly.

I use the term adaptive component because I’m mainly Revit user rather than MAX user! In Autodesk Revit a component that allows complex geometry to be built on a simple set of points defined by user is called Adaptive component. Here we create such an adaptive object by stacking up different modifiers on a simple object that includes verities in its base. This basic object can be an spline shape or editable mesh.In this case I chose Editable spline and because we only deal with straight segments (not curve segment) we must convert the segments to line segments and vertices to corner vertex.

**Step 3 – Converting shapes to meshes**

Here your MAX skills becomes essential. By adding sweep modifier on the base object you can get the basic from out. You can add as many as you need EditPoly modifier to the object, but make sure you rename them properly, otherwise the long list of modifier in Para 3d may become very confusing.Keep in mind if you need to alter a setting in EditPoly modifier you must set the modifier into animate mode.

**Step 4 – Testing the adaptive component.**

Don’t move to the next step until you make sure that geometry can deform as you are expecting. The way I usually test my component is that I make a copy of the object and activate the “Show end result” in modifier stack, then I move the vertices of base object around. If the geometry updates as expected then we can proceed with next step. If not, figure out the problem!

**Step 5 – Building the sample pattern.**

Since Para 3d surface controller will use the object bounding box to fit the objects on the surface divisions we will not get the desired result. The pattern which we are looking for is result of a specific layout of the given geometry. To build such a pattern we need to set a small example so that Para 3d can extract the required transformations from the sample pattern. In this case a 2X2 ( 4 items) will give enough information to Para 3d on how to build this pattern. Make sure you use instance cloning while making the sample pattern.Also for better snapping I turned off all the modifiers.

**Step 6 – Create Parametric Array**

The NURBS surface which we built in first step can be used as 2D domain to divide the surface in two directions (U and V directions). So let’s build a 2d Array. don’t forget to allow access to the sub-object level.**Step 7 – Surface division**

Use surface controller and sub-object controller to place the vertices of the spline shapes on the surface. Surface controller uses the offset values that are generated by Sub-object controller to push the vertices of the adaptive component to the corner of the surface divisions. The W offset controls the distance of the vertices from the surface along the normal vector.**Step 8 – Custom pattern**

After updating the Para 3d in previous step , the objects cover the surface, however, the pattern which we are looking for is not obtained. To get the right pattern we need to inform Para 3d how to alter the divisions on the surface so that objects can fit in the correct location as we expect. Here you can use the sample pattern which you built in step 5. Choose custom pattern in Sub-object controller and then select the 4 instances of adaptive components. Click on the sample pattern button. There is no specific direction in choosing the pattern size and direction. In most cases default settings will work just fine. Some complex pattern may need a couple of try and errors.

**Step 9 – Adjusting parameters**

Once the pattern is achieved, we can assign custom parameter controller to the parameters which may need further adjustments.**Step 10 – Linking the lower part and upper part**

It’s time to connect the two layer of the structure. Create another 2D array of a spline shape with two segments. Look for the vertices that needs to be connected. Remember the index of the vertex and spline and find the same under the vertices list. Use Para-Link controller to connect corresponding vertices. Don’t forget to choose “Global” from Para-Link controller.

In below video you can watch all the steps in above and more.

Part 1

Part 2

]]>

]]>

]]>