|
|||||||||
You can now animate the script like any regular object. Save this plug-in in the Plugins folder. You can now try another example, where you will extend a sphere to create a hemisphere object. It will have two parameters: Radius and Segments, as seen in Figure 18.4. This example will also introduce you to some new concepts. Start a new script and type the code in Listing 18.2, or open the plugin_hemisphere.ms file from the CD.
LISTING 18.2: The Hemisphere plug-in script (plugin_hemisphere.ms) plugin geometry hemisphere name:Hemisphere category:Mastering 3D Studio MAX classid:#(0xce445e62, 0x42606fad) extends:Sphere replaceui:true ( parameters pblock rollout:params ( radius animatable:true type:#worldunits ui:size segments animatable:true type:#integer ui:segs default:32 on radius set val do delegate.radius = val on segments set val do delegate.segments = val ) rollout params Parameters ( spinner size Radius: spinner segs Segments: type:#integer range:[4,1000,32] ) on create do ( delegate.hemisphere = 0.5 delegate.chop = 1 ) tool create ( on mousePoint clickNo do ( if clickNo == 1 do nodeTM.translation = gridPoint if clickNo == 2 then #stop ) on MouseMove clickNo do ( if clickNo == 2 do radius = sqrt(gridDist.x^2+gridDist.y^2+gridDist.z^2) ) ) )
The segments variable in the parameter block has a default value of 32. This is done because the default value of any parameter block is zero, which would set an incorrect parameter to our sphere. Notice you limited the spinner values to the actual limits of the parameters in the sphere object. You also used a new event: on create. Its called when the object is created for the first time, and defines its basic configuration. In this example, it defines that the sphere is a hemisphere. You can play with this script and add the slicing parameters to the extended version. Extending Shapes Extending shapes is pretty much all that plug-in scripts can do to shapes. Theres no way to create new shape objects other than the built-in shapes in MAX. For instance, you can create a plug-in script that will extend the star shape and predefine some parameters. The inner radius will be 55% of the outer radius, and the fillet values will be 10% of it. Start a new script and type out Listing 18.3, or open the file plugin_newstar.ms from the CD.
LISTING 18.3: The New Star plug-in script (plugin_newstar.ms) plugin shape Star_2 name:New Star category:Mastering 3D Studio MAX classID:#(0x4ca7c13d, 0x748bce49) extends:Star replaceui:true ( parameters pblock rollout:params ( radius animatable:true type:#worldunits ui:size points animatable:true type:#integer ui:pt default:6 on radius set val do ( delegate.radius1 = val delegate.radius2 = val*0.55 delegate.filletradius1 = val/10 delegate.filletradius2 = val/10 ) on points set val do delegate.points = val ) rollout params Parameters ( spinner size Radius: range:[0,10000,0] spinner pt Points: range:[3,100,6] type:#integer ) tool create ( on mousePoint clickNo do ( if clickNo == 1 do nodeTM.translation = gridPoint if clickNo == 2 then #stop ) on MouseMove clickNo do ( if clickNo == 2 do radius = sqrt(gridDist.x^2+gridDist.y^2+gridDist.z^2) ) ) )
Notice that this script works the same way as the previous scripts you have made, except that it is extending a Shape object, and its delegating values for several parameters all at once. You can also add regular interface items that will adjust the parameters of the object. For instance, you can create a Helix shape and define its height by selecting the distance between two objects. This cannot be done during the creation process, but can be done in the Modify tab, as seen in Figure 18.5.
Start a new script and type the statements in Listing 18.4, or open the file plugin_helix2.ms on the CD.
LISTING 18.4: The Helix2 plug-in script (plugin_helix2.ms) plugin shape Helix_2 name:New Helix category:Mastering 3D Studio MAX classID:#(0xa13154cd, 0x6c485140) extends:Helix replaceui:true ( parameters pblock rollout:params ( radius animatable:true type:#worldunits ui:rd height animatable:true type:#worldunits ui:ht turns animatable:true type:#integer ui:pt default:6 obj1 type:#node obj2 type:#node on radius set val do ( delegate.radius1 = val delegate.radius2 = val ) on turns set val do delegate.turns = val on height set val do delegate.height = val ) rollout params Parameters ( spinner rd Radius: range:[0,10000,0] spinner ht Height: range:[0,10000,0] spinner pt Turns: range:[1,100,6] type:#integer pickbutton base_obj Select Base Object width:140 pickbutton top_obj Select Top Object width:140 enabled:false on base_obj picked obj do ( obj1 = obj pt1 = obj.pivot top_obj.enabled = true ) on top_obj picked obj do ( obj2 = obj height = distance pt1 obj.pivot ) on params open do ( if obj1 != undefined do base_obj.text = obj1.name if obj2 != undefined do ( top_obj.text = obj2.name top_obj.enabled = true ) ) ) tool create ( on mousePoint clickNo do ( if clickNo == 1 do nodeTM.translation = gridPoint if clickNo == 3 then #stop ) on MouseMove clickNo do ( if clickNo == 2 do radius = sqrt(gridDist.x^2 + gridDist.y^2 + gridDist.z^2) if clickNo == 3 do height = sqrt(gridDist.x^2 + gridDist.y^2 + gridDist.z^2) ) ) ) This script makes use of a new parameter type: the node . Node refers to any object in the scene, and allows you to access any property of this node through the variable. In your example, youre reading the nodes positions and calculating the distance between them. This is done by the two pickbuttons in the rollout. They set the obj1 and obj2 variables, when selected; they also calculate the height of the helix. You are not moving the object and you are not linking it to the others; all you are doing is defining the height using two known objects. Once the objects have been selected, their names will appear in the pickbuttons. This will happen even if you are selecting the helix2 later, because both objects were stored in the parameter blocks. Extending Helpers Helpers can also be extended through plug-ins. Usually, theres not too much that can be done with helpers, because most of them have very few options, but you can extend a dummy object and add the missing length, width, and height options. The next plug-in script will access the .boxsize property of a dummy and allow the user to access the length, width, and height of the dummy like any other MAX object, as seen in Figure 18.6
Start a new script and type the lines found in Listing 18.5, or open the file plugin _dummybox.ms on the CD.
© 2000, Frol (selection, edition, publication) |
|||||||||
|