mcjCollider plugin DS3 PC 32/64bit


mcjCollider is a plugin for Daz Studio 3 , it was tested on Daz Studio v

version history


Oct 30th 2012
resists to conversion of collided objects to subdivision surfaces and to deletion of collided objects
the identity of the collided face is displayed as the label of the channel named "hit"

Feb 2nd 2011 7:22pm
added the 64 bit version of the plugin: mcjCollider64bit.dll
( i cant test it but will report on users results)

Feb 12, 2010 2:15 AM
initial release

Feb 12, 2010 4:15 AM
the collider now only moves forth, making it easier to do a series of collisions
but is the collider starts exactly on a surface it stays put

Feb 12, 2010 4:25 AM
the collider doesn't get stuck when it lies exactly on the wall
making it possible to do a series of collisions
i'll show you right now



You point a ray at objects in a daz scene and this plugin computes the collision point
and the bounce angle.

Although this plugin can be used "by hand" to achieve interesting effects, it is intended to be
used by scripts. in the image below, a Daz Script used a collider 256 times in a row.

In the future i may write a script that animates a dynamic dress.


   a faulty plugin can cause daz studio to crash
so if you experience problems,
you could try removing this (and other) plugins
from your daz studio plugins folder

the plugin, mcjCollider.dll can be found in the attachments at the bottom of this page

this  file should be plced in  your daz studio plugins folder

typically it's

C:\Program Files\DAZ 3D\DAZStudio3\plugins

there's also containing a copy of the document you are reading presently

you could unzip it in a folder like

C:/Program Files/DAZ 3D/DAZStudio3/docs


mcjCollider can be used on any solid object in the scene but not on objects that were converted to subD

select the objects that will be the target of the collider

example: we select the cylinder and the floor-cube ( use the CTRL key for multiple selections )

once properly installed you will find mcjCollider in the "Create" menu

now that the mcjCollider is created in the scene
it will remember the list of selected objects, so you
can deselect them if you want.

in the Scene tab, select the mcjCollider

position it so that it points toward the objects

go in the parameters tab and modify  the "Ray length" property

tweaking this property activates the collider

within a fraction of a second or a few seconds

the collider should jump to the collision point with the solids

the collider will also be oriented as if it had bounced on the surface

Note for Daz Script Programmers:
the collider can be activated through a script
by calling the "activated" slot of the node


node = Scene.getPrimarySelection()

in the attachments below in the

i added a daz script named "jumperDS3"

you select 2 nodes in a scene

example, i select the mcjCollider and a ball

launch jumperDS3

select which node is the destination node

example: i chose mcjCollider as the destination

click on the OK button

and the ball will jump to the location of the collider

using this script and a Collider you could, for example, save some time at making a car follow an uneven road

for the more adventurous, here's the script i used to create the draping effect

this script is included in the attachments  under the name bigpingpong.dsa

this script expects to find a 256-balls figure in the scene

you can get this figure in the attachments below under the name
this should be unzipped in your daz content folder, typically
C:\Program Files\DAZ\Studio\content
once installed it will appear in your library in Content/figures/mcasual

place your collider at the proper angle to "throw the balls on the floor and cylinder

the wall of balls will be located at Z = -100

select the mcjCollider

launch the script

on my PC it takes only 1 second to make the millions of computations !

at frame 30 the script builds a wall of balls

and at frame 90 all the balls arrive at their collision point

// DAZ Studio version 3.0 filetype DAZ Script

node = Scene.getPrimarySelection();

z = -100

Scene.setFrame( 30 );

for( x = 0; x < 16; x++ )

for( y = 0; y < 16; y++ )


i = y * 16 + x;

ballnode = Scene.findNode( "ball" + i );



( x / 16 ) * 200 - 100,

( y / 16 ) * 200,





Scene.setFrame( 90 );

basepos = node.getWSPos();

baserot = node.getWSRot();

for( x = 0; x < 16; x++ )

for( y = 0; y < 16; y++ )


i = y * 16 + x;

ballnode = Scene.findNode( "ball" + i );

pos = ballnode.getWSPos();

node.setWSPos( pos );



pos = node.getWSPos()

ballnode.setWSPos( pos );

node.setWSPos( basepos );

node.setWSRot( baserot );


another test, done with the 4:25am version

node = Scene.getPrimarySelection();

ball = Scene.findNode( "ball" );

fr = 0;

pos = node.getWSPos();

for( i = 0; i < 30; i++ )


Scene.setFrame( fr );

ball.setWSPos( pos );


nupos = node.getWSPos();

dist = nupos.subtract( pos );

d = dist.length();

pos = nupos;

fr += d / 10;


the script is in the attachments as pingpong.dsa
the ball which must be in the scene is also in the attachments as ball.obj
the box was 4x4x4 meters
the box was selected upon creation of the mcjCollider
the ball was scaled 600%
FPS was set at 10
the mcjCollider must be selected when you launch the script

i used the free script setInterpolation
to linearize the animation keyframes
without this the ball was moving along curves and it made no sense

New in October 2012's version

A parameter/channel named "report" was added to the mcjCollider node

its label displays the identity of the face that got the collision

for example:

if the collision occured on a figure bone, we would have something like

so, the first part of the label is the skeleton name, or "none" if it's not a bone

the second part is the bone or object name

the 3rd part is the type of face hit
  • 0 : Triangle
  • 1 : Quad
  • 2 : Polygon

the 4th part is the face number

here's script code that will create a Morph channel to move the collided face

it's a solution for poke-through fixing !

this script can be downloaded in the attachments section under the name


 // DAZ Studio version 3.1  filetype DAZ Script

function doit()
    var collider = Scene.findNodeByLabel( "mcjCollider" );
    var str = collider.findProperty( "report" ).getLabel();
    strs = str.split("\t");
    if( strs.length < 4 )
    var skelname = strs[0];
    var nodename = strs[1];
    var facetype =  Number( strs[2] ); 
    var faceno = Number( strs[3] );
    if( skelname != "none" )
        skel = Scene.findNode( skelname );
        node = skel.findBone( nodename );
        node = Scene.findNode( nodename );
    obj = node.getObject();
    geom = obj.getCurrentShape().getGeometry();
    var vertIndexes = new Array();
    switch( facetype )
        case 0:
            var face = geom.getTri( faceno );
            vertIndexes.push( face.edge1.vertIndex );
            vertIndexes.push( face.edge2.vertIndex );
            vertIndexes.push( face.edge3.vertIndex );
        case 1:
            var face = geom.getQuad( faceno );
            vertIndexes.push( face.edge1.vertIndex );
            vertIndexes.push( face.edge2.vertIndex );
            vertIndexes.push( face.edge3.vertIndex );
            vertIndexes.push( face.edge4.vertIndex );
        case 2:
            var face = geom.getPoly( faceno);
            var n = face.edges.length;
            for( var i = 0; i < n; i++ )
                vertIndexes.push( face.edges[i].vertIndex );
    makeMorph( obj, geom, faceno, vertIndexes )

function makeMorph( obj, geom, faceno, vertIndexes )
    var morphDeltas = new DzMorphDeltas();
    var n = vertIndexes.length;
    var v1 = geom.getVertex( vertIndexes[0] );
    var v2 = geom.getVertex( vertIndexes[1] );
    var v3 = geom.getVertex( vertIndexes[2] );
    v12 = v2.subtract( v1 );
    v13 = v3.subtract( v1 );
    var norm = v12.cross( v13 );
    for( var i = 0; i < n; i++ )
        morphDeltas.addDelta( vertIndexes[i], norm.x, norm.y, norm.z );
    var morphname = "face" + faceno;
    var modifier = obj.findModifier( morphname );
    if( !modifier )
        modifier = new     DzMorph( morphDeltas );
        modifier.setLabel( morphname );
        modifier.setName( morphname );
        obj.addModifier( modifier );
        modifier.setDeltas( morphDeltas );
        modifier.getValueChannel().setHidden( false );

mCasual Jacques,
Feb 11, 2010, 11:10 PM
mCasual Jacques,
Feb 12, 2010, 2:00 AM
mCasual Jacques,
Feb 11, 2010, 11:14 PM
mCasual Jacques,
Feb 11, 2010, 11:14 PM
mCasual Jacques,
Feb 12, 2010, 1:25 AM
mCasual Jacques,
Feb 2, 2011, 4:21 PM
mCasual Jacques,
Feb 11, 2010, 11:30 PM
mCasual Jacques,
Feb 2, 2011, 4:51 PM
mCasual Jacques,
Oct 30, 2012, 10:03 PM
mCasual Jacques,
Oct 30, 2012, 5:40 PM
mCasual Jacques,
Feb 12, 2010, 2:00 AM