• Welcome to the Community Forums at HiveWire 3D! Please note that the user name you choose for our forum will be displayed to the public. Our store was closed as January 4, 2021. You can find HiveWire 3D and Lisa's Botanicals products, as well as many of our Contributing Artists, at Renderosity. This thread lists where many are now selling their products. Renderosity is generously putting products which were purchased at HiveWire 3D and are now sold at their store into customer accounts by gifting them. This is not an overnight process so please be patient, if you have already emailed them about this. If you have NOT emailed them, please see the 2nd post in this thread for instructions on what you need to do

How to handle SmartProp parenting between multiple props?

Miss B

Drawing Life 1 Pixel at a Time
CV-BEE
I never had any luck creating magnets with V4, though it would've helped so I could create my own characters, especially facial shapes. Then again, I didn't have any luck with deformers in DS either. Guess I'm just not a magnet kind of gal. ;)
 

Semicharm

Eager
I had the same problem with another project. The solution I ended up using was to convert the parent prop into a "figure". Sure, it's a single prop with no real rigging at all, but the parented props would attach to the selected parent rather than the first loaded copy. I think having separate bowl props with the food or water preloaded would be the easiest solution in your case. Just wanted to mention it just in case it might be helpful in the future.
 

Ken1171

Esteemed
Contributing Artist
I never had any luck creating magnets with V4, though it would've helped so I could create my own characters, especially facial shapes. Then again, I didn't have any luck with deformers in DS either. Guess I'm just not a magnet kind of gal. ;)

I use magnets for a lot of different things - they are some of the most underestimated things in Poser/DS. I know somebody else has already made a magnets tutorial, but I was thinking on making my own. :)

I had the same problem with another project. The solution I ended up using was to convert the parent prop into a "figure". Sure, it's a single prop with no real rigging at all, but the parented props would attach to the selected parent rather than the first loaded copy. I think having separate bowl props with the food or water preloaded would be the easiest solution in your case. Just wanted to mention it just in case it might be helpful in the future.

In my case it's the same bowl for both food and water, so I just saved them already parented to the library. Nothing had to be changed, converted, or duplicated, so it was the simplest and most economical solution. The props can still be separated and each still have their own separate material presets.

But if I had different bowls to be parented to, then yes, making them figures could fix the problem.
 

Semicharm

Eager
As sort of an experiment, I wanted to see what it would take to convert a simple prop into a "figure". Well, not much apparently. Just a changing "prop" to "actor" and a bit of editing was all that was needed. Didn't touch a thing inside the prop itself, so I omitted that part.

Code:
{
   version
   {
       number 8
   }
   prop Bowl
   {
       storageOffset 0 0.3487 0
       objFileGeom 0 0 :Runtime:libraries:Props:Primitives:P8Bowl.obz
   }
   prop Bowl
   {
   ...
   }
   doc
   {
       addActor Bowl
   }
}

Code:
{
   version
   {
       number 8
   }
   figureResFile :Runtime:libraries:Props:Primitives:P8Bowl.obz
   actor Bowl
   {
       storageOffset 0 0 0
       geomHandlerGeom 13 Bowl
   }
   figureResFile :Runtime:libraries:Props:Primitives:P8Bowl.obz
   actor Bowl
   {
   ...
   }
   figure
   {
       name Bowl
       root Bowl
       defaultPick Bowl
       displayOn 1
       allowsBending 0
       canonType 1
       conforming 0
       displayMode USEPARENT
       locked 0
   }
}
 

Ken1171

Esteemed
Contributing Artist
Actually, a figure must have body groups. At least 1 group in this case, so a bone could be assigned to it. That's what it takes to make a figure. It's that bone group that would be used to parent SmartProps to, so the group name is the most important thing. If there are no body groups, Poser will create one automatically, but that will end up with a random group name, which is not what you want. Better create the group manually, but if you do it in Poser, it will generate a new OBJ with split geometry, which is definitely not what you want. But if only 1 group exists, and it uses the entire geometry, the new OBJ will not be split, and could even be replaced by the original one.
 

Ken1171

Esteemed
Contributing Artist
Well, how the heck did you get lost in the forest, when all the time you knew there was a trail?

I didn't convert my props to figures, I just saved them already parented. Semicharm used another solution that required more work. Converting figures to props is rather easy, but props to figures is complicated because they have no body groups.
 

Semicharm

Eager
As I said before, I just mentioned it as an FYI, not as a "solution" to your current problem.

BTW, a valid OBJ file should have at least one group. In the example I used, it's referenced in "geomHandlerGeom 13 Bowl". And props in Poser already have most of the same data as a body part "actor". The only major difference is the links to bones in other actors. In this case, there are no other bones to link to. It works just fine without the extraneous data required for an normal rigged figure.
 

quietrob

Extraordinary
Why is it that I've seen Props WITHOUT Geometry? From this discussion I would think it necessary. Is only drawback to lacking a geometry is that you can't add dynamic morphs?
 
If there's no geometry, what do you see?
A prop without geometry is usually called a 'null'.
It can't be seen but helps, in Poser, to orient things. Or move a collection of child objects together.
Because in some cases if you rotate a prop on it's x axis before any other rotation, the z and y axes merge and then it won't rotate on the world y anymore.
'Course that can be fixed by rotating first on z or y.
Or change the rotation order maybe.
But if there is no geometry, what good are the deltas?
They can't work.
If you ever look at the delta list for the morphs you see that each line has an extra entry.
That is four entries instead of three.
And the first entry is an index into the list of vertices in the geometry which tells Poser which vertex to move by the amount that is specified by the next three entries.
Doesn't seem like any of that is a drawback though.
It's just the way 3D graphics works.
 

Ken1171

Esteemed
Contributing Artist
Why is it that I've seen Props WITHOUT Geometry? From this discussion I would think it necessary. Is only drawback to lacking a geometry is that you can't add dynamic morphs?

Where exactly have you seen this? DAZ Studio has native support for NULLs, but Poser doesn't. That is, you can create a native Null primitive in DS, but not in Poser. At best, Poser can create "Groups" that won't show in renders, but they still have a cube primitive so we can select and position them , so they do have geometry. I think it's a similar thing with Nulls in DS - though they just display their origin point, and really have no geometry.

The more likely situation is what Satira has said above - the geometry does exist but it's embedded into the PP2, which is [unfortunately] what Poser does by default when we save props to the library.

As for your question, the main disadvantage of embedded geometry is that every time you add a prop to the library, it duplicates the space on disk. If the geometry were extracted, then all instances of the prop will reuse the same OBJ that is already the Geometries folder, making the props smaller. Another disadvantage is that if you need to change something in the geometry, you can't do that when it's embedded, making the process more difficult. If there are multiple copies of the prop in the library, fixing one will NOT fix the others because each has their own local copy of the geometry. Lastly, content stores will NOT accept props with embedded geometry.
 
Last edited:
@Ken1171 Sure you can have a null in Poser.
That's just what I was talking about.
I think one way I do it is to load a null in lightwave and export as obj.
Another way is to open a simple prop, like a cube, in an editor and just remove the v and f items from the list and there you have it.
 
At best, Poser can create "Groups" that won't show in renders, but they still have a cube primitive so we can select and position them , so they do have geometry.
I was thinking about this statement^

Here you go, a Poser Null taken from the Props library. It works like this:
{

version
{
number 10.04
build 28925
}
prop null
{
geomCustom
{
numbVerts 0
numbTVerts 0
numbTSets 0
numbElems 0
numbSets 0
s 0
g default
}

}

prop null
{
name null
on
bend 1
animatableOrigin 0
dynamicsLock 1
hidden 0
addToMenu 1
castsShadow 1
includeInDepthCue 1
useZBuffer 1
parent UNIVERSE
creaseAngle 80
subdivLevels 0
subdivRenderLevels 0
backfaceBehavior 1
channels
{
groups
{
groupNode Transform
{
parmNode Scale
parmNode xScale
parmNode yScale
parmNode zScale
parmNode yRotate
parmNode xRotate
parmNode zRotate
parmNode xTran
parmNode yTran
parmNode zTran
}
}
xOffsetA OriginX
{
name originX
initValue 0
hidden 1
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.004
keys
{
static 1
k 0 0
}
interpStyleLocked 0
staticValue 0
}
yOffsetA OriginY
{
name originY
initValue 0
hidden 1
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.004
keys
{
static 1
k 0 0
}
interpStyleLocked 0
staticValue 0
}
zOffsetA OriginZ
{
name originZ
initValue 0
hidden 1
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.004
keys
{
static 1
k 0 0
}
interpStyleLocked 0
staticValue 0
}
propagatingScale Scale
{
name scale
initValue 1
hidden 0
enabled 1
forceLimits 0
min 0.001
max 100000
trackingScale 0.004
keys
{
static 0
k 0 1
}
interpStyleLocked 0
}
propagatingScaleX xScale
{
name xScale
initValue 1
hidden 0
enabled 1
forceLimits 0
min 0.001
max 100000
trackingScale 0.004
keys
{
static 0
k 0 1
}
interpStyleLocked 0
}
propagatingScaleY yScale
{
name yScale
initValue 1
hidden 0
enabled 1
forceLimits 0
min 0.001
max 100000
trackingScale 0.004
keys
{
static 0
k 0 1
}
interpStyleLocked 0
}
propagatingScaleZ zScale
{
name zScale
initValue 1
hidden 0
enabled 1
forceLimits 0
min 0.001
max 100000
trackingScale 0.004
keys
{
static 0
k 0 1
}
interpStyleLocked 0
}
rotateY yRotate
{
name yrot
initValue 0
hidden 0
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 1
keys
{
static 0
k 0 0
}
interpStyleLocked 0
}
rotateX xRotate
{
name xrot
initValue 0
hidden 0
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 1
keys
{
static 0
k 0 0
}
interpStyleLocked 0
}
rotateZ zRotate
{
name zrot
initValue 0
hidden 0
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 1
keys
{
static 0
k 0 0
}
interpStyleLocked 0
}
translateX xTran
{
name xtran
initValue 0
hidden 0
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.001
keys
{
static 0
k 0 0
}
interpStyleLocked 0
trackingScaleMult 1
}
translateY yTran
{
name ytran
initValue 0
hidden 0
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.001
keys
{
static 0
k 0 0
}
interpStyleLocked 0
trackingScaleMult 1.000000
}
translateZ zTran
{
name ztran
initValue 0
hidden 0
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.001
keys
{
static 0
k 0 0
}
interpStyleLocked 0
trackingScaleMult 1.000000
}
xOffsetB xOffB
{
name xOffB
initValue -0
hidden 1
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.004
keys
{
static 1
k 0 0
}
interpStyleLocked 0
staticValue -0
}
yOffsetB yOffB
{
name yOffB
initValue -0
hidden 1
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.004
keys
{
static 1
k 0 0
}
interpStyleLocked 0
staticValue -0
}
zOffsetB zOffB
{
name zOffB
initValue -0
hidden 1
enabled 1
forceLimits 0
min -100000
max 100000
trackingScale 0.004
keys
{
static 1
k 0 0
}
interpStyleLocked 0
staticValue -0
}
}
endPoint 0 5e-007 0
origin 0 0 0
orientation 0 0 0
displayOrigin 0
displayMode USEPARENT
customMaterial 1
material Preview
{
KdColor 0.490799 0.408521 0.841517 1
KaColor 0 0 0 1
KsColor 0.0889492 0.00943022 0.029487 1
TextureColor 1 1 1 1
NsExponent 50
tMin 0
tMax 0
tExpo 0
bumpStrength 1
ksIgnoreTexture 0
reflectThruLights 0
reflectThruKd 0
textureMap NO_MAP
bumpMap NO_MAP
reflectionMap NO_MAP
transparencyMap NO_MAP
ReflectionColor 1 1 1 1
reflectionStrength 1
}
locked 0
backfaceCull 0
visibleInReflections 1
visibleInRender 1
visibleInCamera 1
visibleInIDL 1
displacementBounds 0
shadingRate 0.2
smoothPolys 1
}
doc
{
addActor null
}
}
 

Ken1171

Esteemed
Contributing Artist
It would be cool if we could create those straight from the Poser menu. There are so many things we can do with them. But I guess the simplest way to do this in Poser is to load a cube primitive and make it invisible. That's how I create, for instance, light targets in Poser. I can point multiple spotlights at once this way, which saves a lot of work. In other 3D programs, this would typically be done with null objects.

Like you have shown above, there are many ways to create nulls, and mine is the invisible cube because its simple geometry gives me something to manipulate directly on the scene. The cube becomes both the null object and it's manipulation handle :)
 
Maybe the simplest way is to use the grouping object. Since all of it's properties transfer to it's children.
It only has an icon, like cameras and lights do, but no surfaces that can be rendered.
I just use nulls out of habit I guess, 'cause of being used to working in Lightwave, and because they can have any name.
If I recall, the grouping objects are just called group'n' and they can be hard to find in complex scenes, from the document window.
I use a null to put together my Jazz Kit set of drums.
All the parts of the drum kit are characters so they can be pose-able.
And there are poses saved to set them up for a certain character.
A pose for each drum or cymbal.
They make a tight group of objects in the scene and either a null or a grouping object can't be seen.
So I can name the null 'KitHolder' and find it real easy in the hierarchy editor.
Other stuff like that.
The null that is imported from Lightwave actually has four vertices, all at 0.000000 and one face referencing those,
but it can't be seen because the face, being a quad with no dimension is 'Null'
Works the same anyway.
 
Top