In this post, I provide a procedure for setting up Carbon LDP with Stardog as the database, from scratch. Further documentation can be found on the product documentation page, Enterprise-class repositories. This procedure will detail how to run both Carbon LDP and Stardog together as two linked Docker containers.

Obtain Stardog and license key file

To create the Stardog container, you will need the Stardog binary and a license key. Head over to stardog.com and fetch yourself the 30-day Enterprise trial or Community Edition.

Setup the Stardog docker container

First, we’ll setup the Stardog container. For this, we’ll use Jon Tutcher’s Stardog dockerfile. Use the following command to get Jon’s repo. In my case, I am providing a new name for the local repo (stardog-docker-jontutcher).

git clone https://github.com/jontutcher/stardog-docker.git stardog-docker-jontutcher

Navigate into the directory and create a resources directory inside of it…

cd stardog-docker-jontutcher/
mkdir resources

Put the Stardog license key file into the resources directory. The file must be named stardog-license-key.bin. You can obtain a license key for the 30 day enterprise trial or community edition at stardog.com. The license key will be picked up from the resources directory and built into the image when we build from the dockerfile.

Back out of the resources directory and run the docker build command.

cd ..
docker build --tag stardog:latest .

Now use the following command to run the container.

docker run \
    -d -p 5820:5820 \
    --name stardog-instance \
    -v /Users/cburleson/data/stardog:/stardog \
    stardog:latest

Note that the -v parameter should point to your Stardog data directory on your host machine. If you do not have an existing Stardog data directory, you should create an empty one and refer to that.

You can use the following command to verify the container exists and is running:

docker ps -a

In your web browser, navigate to http://localhost:5820/ to access the Stardog administrative interface. You can login with the default username and password: admin | admin. Alternatively, you can access Stardog through Stardog Studio, a separate download.

Create a database in Stardog for Carbon LDP

Next, we’ll create a database in the Stardog server for the Carbon platform to use. Through the web interface, you can do this through Databases > New DB. Create a new database with all the default options except for “Database online”, which you should switch to OFF. This will allow us to edit the database configuration directly after creating it. Name the database whatever you want, such as “carbonldp”. In my case, I’m using the name “carbonldp-industrial” for the industrial PoC I’m building.

After creating the database, edit it and set Query all graphs to ON, which is necessary for Carbon to function properly.

Now Save the database configuration and turn the database ON.

Configure and run the Carbon LDP platform container

Spinning up a Carbon LDP platform container requires only one docker command. But first, you need to…

Create a persistent volume for Carbon LDP

Create a directory on your local machine that can be used as a persistent volume for the Carbon platform container. In my case, I created the following directory, for example:

/Users/cburleson/data/carbonldp-industrial

Run the Carbon LDP container

The prerequisites are set. So, now we can spin up a Carbon server with the following Docker command. Be sure to replace the -v parameter with the path you created for your persistent Carbon directory. Leave everything after the colon in tact (don’t touch the part, :/opt/carbonldp/shared). At the time of this writing, the latest version of Carbon is 1.0.x-alpha. If there is a later version by the time you read this, you can use that. Also be sure to change the name of the carbonldp.repository.id parameter to the name of the database you created for Carbon in the Stardog server. You can name the container whatever you want. It’s typical to call it “carbonldp”, but in my case, I’m running it with the container named “carbonldp-industrial” This allows me to have multiple carbon containers for different purposes. As per my own settings, the full command is as follows:

docker run -d --name carbonldp-industrial -p 8083:8083 \
    -v /Users/cburleson/data/carbonldp-industrial:/opt/carbonldp/shared \
    --link stardog-instance:stardog-instance carbonldp/carbonldp-platform:1.0.x-alpha \
    --carbonldp.repository.type="stardog" \
    --carbonldp.repository.url="http://stardog-instance:5820/" \
    --carbonldp.repository.username="admin" \
    --carbonldp.repository.password="admin" \
    --carbonldp.repository.id="carbonldp-industrial"

In order for the two containers to communicate with one another, they are linked with Docker link parameter.  The value of that parameter is the container (<name or id>:alias or <name or id>). In my case, stardog-instance:stardog-instance, where stardog-instance is the name of the Stardog container and also referred to in the carbonldp.repository.url value.

If the Carbon image is not yet present on your machine, it will be fetched by the command from Docker Hub. You can execute the following Docker command to verify that the container is up and running.

docker ps -a

Is the STATUS is Exited, there was a problem in the startup. If you see such a problem, you can run the following command to examine the logs for troubleshooting:

docker logs <container-name>

Or, in my case…

docker logs carbonldp-industrial

If Carbon started up successfully, its logs should resemble the following:

┌----------------------------------------------------------------------------------------------------┐

                                                ssss,
                                                sssss
      ,.-::/::-.,     ,.-::/::., .--- ,---,,-:, sssss ,-::/::-.,     ,.-::/::-.,   ,---. ,.::/::.,
   ,-+ossssssssso+. -+osssssssso/+sss :sss+osss ssss:+ssssssssso/. -+ossssssssss+: :sss+/ossssssso-.
  -ossso/:---:/os+ +ssso+:---:+osssss :ssss+:-: sssssso/----:+ssss+ oso+:----/ossso :ssss+/:-:/ossso.
 -ssss:`       `: osss/`       `/ssss :sss+     sssso-        .ossso /`       `-osss :ss-      `/ssso
 osss/           +sss+           +sss :sss+     ssss-          `ssss            -ssss o+        `ssss
 ssss:           osss/           :sss :sss+     ssss.           ssss            .ssss o/        `ssss
 /ssso.          +ssso.         .osss :sss+     ssss+,         :ssss           `+ssso s/        `ssss
 `+ssso/.,   ,./o +ssso/.,   ,./ossss :sss+     ssssso:,    ,-+ssss: o/.,   ,.:ossso +s/        `ssss
   -ossssooooossso -ossssooooosssosss :sss+     ssssosssooooossss+. ssssooooosssso: oss/        `ssss
     .:/oossso+/-`   .:+osssso/:`:+++ -+++:     ++++`./+ossso+/-`   `:/+osssoo+:.  -+++:        `++++

├┬---------------------------------------------------------------------------------------------------┤
 ¦ Platform: v1.0.0-alpha.13 (Build: 2018-04-12T16:39:27+0000)
 ¦
 ¦ https://carbonldp.com
└┴---------------------------------------------------------------------------------------------------┘

INFO  [                         c.c.Application] -- Starting Application v1.0.0-alpha.13 on 6a8195e0e2e2 with PID 7 (/opt/carbonldp/carbonldp-platform.jar started by root in /)
DEBUG [                         c.c.Application] -- Running with Spring Boot v2.0.1.RELEASE, Spring v5.0.5.RELEASE
INFO  [                         c.c.Application] -- The following profiles are active: default
DEBUG [c.c.r.t.TxnConfig$$EnhancerBySpringCGLIB$$5dca10a3] -- Connecting with configured Stardog repository...
DEBUG [c.c.r.t.TxnConfig$$EnhancerBySpringCGLIB$$5dca10a3] -- Connecting with configured Stardog repository...DONE
DEBUG [                     c.c.l.LockingConfig] -- Starting embedded ZooKeeper server...
DEBUG [                     c.c.l.LockingConfig] -- Starting embedded ZooKeeper server...COMPLETE
DEBUG [   c.c.s.a.t.JWTokenAuthenticationFilter] -- Initializing filter 'jwTokenAuthenticationFilter'
DEBUG [   c.c.s.a.t.JWTokenAuthenticationFilter] -- Filter 'jwTokenAuthenticationFilter' configured successfully
DEBUG [ c.c.s.a.a.AnonymousAuthenticationFilter] -- Initializing filter 'anonymousAuthenticationFilter'
DEBUG [ c.c.s.a.a.AnonymousAuthenticationFilter] -- Filter 'anonymousAuthenticationFilter' configured successfully
INFO  [                         c.c.Application] -- Started Application in 11.816 seconds (JVM running for 13.061)

Verify Carbon data in the Stardog server

For an additional validation, you can verify that the database in Stardog has some preliminary Carbon-specific data in it. In the Stardog web console at http://localhost:5820/, navigate to the database you created for Carbon, click on >_ Query and run the following SPARQL query for Types:

select distinct ?type ?label 
where { 
  ?s a ?type . 
  OPTIONAL { ?type rdfs:label ?label } 
}

You should see Carbon-specific types in the results as shown below…

Verify Carbon response in web browser

You can also do a check for a response from the Carbon server by hitting the following URL in your web browser:

http://localhost:8083/.system/platform/

The browser should return an RDF response similar to the following (the platform meta, which includes the build date and version):

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about="http://localhost:8083/.system/platform/">
    <rdf:type rdf:resource="http://www.w3.org/ns/ldp#Container"/>
    <rdf:type rdf:resource="https://carbonldp.com/ns/v1/platform#RequiredSystemDocument"/>
    <rdf:type rdf:resource="http://www.w3.org/ns/ldp#RDFSource"/>
    <rdf:type rdf:resource="http://www.w3.org/ns/ldp#BasicContainer"/>
    <rdf:type rdf:resource="http://www.w3.org/ns/ldp#Resource"/>
    <rdf:type rdf:resource="https://carbonldp.com/ns/v1/platform#Document"/>
    <rdf:type rdf:resource="https://carbonldp.com/ns/v1/platform#Platform"/>
    <membershipResource xmlns="http://www.w3.org/ns/ldp#" rdf:resource="http://localhost:8083/.system/platform/"/>
    <modified xmlns="https://carbonldp.com/ns/v1/platform#" rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2018-07-17T20:06:25.656Z</modified>
    <created xmlns="https://carbonldp.com/ns/v1/platform#" rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2018-07-17T20:06:25.656Z</created>
  </rdf:Description>
  <rdf:Description rdf:nodeID="node1ciktjenqx53">
    <rdf:type rdf:resource="https://carbonldp.com/ns/v1/platform#PlatformInstance"/>
    <rdf:type rdf:resource="https://carbonldp.com/ns/v1/platform#VolatileResource"/>
    <buildDate xmlns="https://carbonldp.com/ns/v1/platform#" rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2018-04-12T16:39:27.000Z</buildDate>
    <version xmlns="https://carbonldp.com/ns/v1/platform#">1.0.0-alpha.13</version>
  </rdf:Description>
    <rdf:Description rdf:about="http://localhost:8083/.system/platform/">
    <instance xmlns="https://carbonldp.com/ns/v1/platform#" rdf:nodeID="node1ciktjenqx53"/>
  </rdf:Description>
</rdf:RDF>

You’re good to go! You may, however, wish to use the Carbon LDP Workbench as well.

Run the Carbon LDP Workbench

The Carbon LDP Workbench provides a visual interface to your Carbon instance data. You can spin up the workbench with the following command:

docker run -d --name carbonldp-workbench -p 8000:80 \
    -e "CARBON_HOST=localhost:8083" \
    -e "CARBON_PROTOCOL=http" \
    carbonldp/carbonldp-workbench:1.0.x-alpha

You can then access the Workbench at the following URL:

http://localhost:8000/

If you see any errors in the Workbench when first accessing it, try a hard refresh in your browser.

Accessing the Stardog container’s shell

If you want to get into the Stardog container to execute stardog-admin commands, use the following Docker command:

docker exec -it <stardog-container-name> bash

In my case:

docker exec -it stardog-instance bash

Then you can change into the stardog/bin directory…

cd /stardog/bin

And execute stardog-admin commands, such as…

./stardog-admin help

You can type exit to exit out of the container and back to your host shell.

Accessing the Carbon LDP container’s shell

If you want to get into the Carbon LDP container, you can use a similar command. However, the Carbon container does not include bash, so you can use sh instead…

docker exec -it <carbon-container-name> sh

You can type exit to exit out of the container and back to your host shell.

Conclusion

This post described the procedure for setting up a Carbon LDP container configured to run with a Stardog database in a Stardog container. Additionally, we setup the Carbon LDP Workbench. And finally, I showed how you can get inside the Stardog container to execute stardog-admin commands. The procedure results in three Docker containers providing everything you need for Carbon LDP with Stardog development environment.

 

I just learned that there’s an fabulously detailed female anatomy model that comes out-of-the-box with ZBrush. I never took much notice of the tool because it’s thumbnail in the tool palette is just a skeleton, but as it turns out, it’s really much more.

In ZBrush, press , to open the Lightbox.

Find and open the Ryan_Kingslien_Anatomy_Model.ZTL file with the thumbnail preview of a skeleton. Draw the tool on the canvas and you will see there’s more to it than just a skeleton!

If you examine the subtool palette, you will also note that the tool is comprised of several subtools with anatomical names for each. This is great for helping you learn the anatomical names of various body parts.

The tool was developed by Ryan Kingslien. To learn from this master, check out his YouTube channel. He’s an amazing dude.

When developing with the Carbon LDP JavaScript SDK and using the sparqler library, you could stumble upon the error: Error: The used prefix has not been declared. In one case where I generated this error, the complete console error was as follows:

ExploreComponent.html:48 ERROR Error: The used prefix has not been declared
    at IRIResolver.push../node_modules/sparqler/iri/IRIResolver.js.IRIResolver.resolve (IRIResolver.js:23)
    at TriplesPattern.js:69
    at Array.reduce ()
    at Variable.push../node_modules/sparqler/patterns/triples/TriplesPattern.js.TriplesPattern._resolvePath (TriplesPattern.js:57)
    at Variable.push../node_modules/sparqler/patterns/triples/TriplesPattern.js.TriplesPattern._addPattern (TriplesPattern.js:33)
    at Variable.push../node_modules/sparqler/patterns/triples/TriplesPattern.js.TriplesPattern.has (TriplesPattern.js:14)
    at explore.service.ts:248
    at Array.forEach ()
    at ExploreService.push../src/app/services/explore.service.ts.ExploreService._constructFiltersPatterns (explore.service.ts:238)
    at explore.service.ts:115

The problem was with the following offending line in my code:

filterPatterns = _.var(subjectName).has(filter.property.id, _.literal(filter.object).ofType(filter.property.range));

The filter.property.id string was being interpreted as a prefix and the fix was to wrap filter.property.id with the _.resource() method of the PatternBuilder utility like this:

_.resource(filter.property.id)

This made it so that a string such as https://example.com/ would be reflected instead as <https://example.com/>.

General information about querying can be found in the Carbon LDP product documentation on Querying.

My notes on ZBrush keyboard shortcuts (hotkeys) and control. This page is derived largely from the ZBrush 4R7 and ZBrush Core Online Documentation, © 2016 by Pixologic, Inc. I have reproduced much of the Keyboard Shortcut documentation here for the purpose of personal study and with the hope of adding additional notes that may be helpful to others who, like me, are new to the software.

General Shortcuts

Action Key(s) Notes
Open Project CTRL +
O
Save Project CTRL +
S
Undo CTRL +
Z
Redo SHIFT +
CTRL +
Z
Popup selection (on PC only)
  • Tools –
    F1
  • Brushes –
    F2
  • Strokes –
    F3
  • Alphas –
    F4
  • Textures –
    F5
  • Materials –
    F6 (with cursor
    off canvas area)
Show QuickMenu SPACE or right-click
Show/hide floating palettes TAB
Show item description CTRL + cursor over item When Popup Info is switched on.
Show alternative item description CTRL + ALT + cursor over item
Assign custom hotkey CTRL+ ALT + click on item Stores hotkeys in Preferences > Hotkeys submenu
Projection Master G

Lightbox and Spotlight

Action Key(s) Notes
Show/hide Lightbox ,
load selected item double-click on Lightbox thumbnail Texture / Alphas will be loaded into Spotlight if it is active.
Turn on/off Spotlight SHIFT +
Z
Show/hide Spotlight Dial Z

Right-Click Navigation

Turn on RightClick Navigation in the Preferences > Interface menu.

Action Key(s) Notes
Move ALT + right-click & drag (can be over the model)
Scale CTRL + right-click & drag (can be over the model)
Rotate right-click & drag (can be over the model)

Transpose

  • With a 3D mesh in Edit mode, press W (Move), E (Scale), or R (Rotate), then click and drag to draw the orange action line.
  • Click on the mesh to reposition the action line aligned to the surface normal.
  • To align to an axis, click the end of the red, green or blue axis line.
Action Key(s) Notes
Move action line while drawing Hold SPACE
Move action line after drawing click + drag orange line or center orange ring
Change action line end point position click + drag orange end ring
Toggle between the Transpose line and Gizmo 3D Y while in Move, Scale, or Rotate mode

Quick tip: in Move/Scale mode, ALT + click + drag on the mesh (not on action line) to move or scale mesh

Inner (red/white) ring actions

These actions apply to the inner red or white rings of the action line. The terms center or end refer to the position on the line.

Action Key(s) Notes
Move mode –
W
Move click + drag center
Duplicate mesh CTRL + click + drag center
Bend mesh ALT + click + drag center or end point
Stretch mesh drag end point furthest from mesh
Flatten mesh drag end point next to mesh
Inflate right-click + drag end ring furthest from mesh
Create Edgeloop & extrude with partially masked mesh, hold
CTRL and click + drag center point
Scale –
E
Scale click + drag end point in line direction
Scale along axis click + drag center point
Create Edgeloop and deflate / inflate with partially masked mesh, hold
CTRL and click + drag center point
Rotate –
R
Rotate around end point click + drag other end point
Rotate around action line click + drag center
Joint bend ALT + click + drag end point (rotation around same point)

Sculpting and Painting

Action Key(s) Notes
Draw Size S
Focal Shift O
RGB Intensity I
Z Intensity U
Increase Draw Size by set units ] (set increment in the
Zplugin > Misc Utilities > Brush Increment slider)
Decrease Draw Size by set units [ (set increment in the
Zplugin > Misc Utilities >Brush Increment slider)
Edit mode on/off T
Draw Q
Move W
Scale E
Rotate R
Toggle ZAdd and ZSub ALT While brushing on a model, hold down ALT to toggle from ZAdd to ZSub.

Sculpting Brushes

Each brush has its own keyboard shortcut combo. You can learn them by pressing B to bring up the brush palette, then a letter like C (to filter by all brushes starting with C), and then the letter indicated in the top left of the brush icon in to brush palette.

Action Key Sequence
Show Brush pop-up B
Clay Buildup B +
C +
D
Damien Standard (dam std) B +
D +
S
Inflate B +
I +
N
Move B +
M +
V
Spiral B +
S +
A
Hold down ALT to spiral in the opposite direction.
ZModeler B +
Z +
M

InsertMultiMesh brushes

Action Key(s) Notes
Show all meshes in brush M

Changing the Brush hotkeys (pop-up palette)

Here is what you have to do:

  • Press B to bring up the brush palette.
  • Then click or press the letter that you want to narrow down to, in this example press C.
  • With C selected all you will see is the brushes that start with C. You will see the next letter that selects the brush.
  • At this point you can hold CTRL + ALT to change the shortcut to whatever you want by just clicking on the brush and then click your new shortcut.

NOTE: Keep in mind that when you do this ZBrush automatically replaces the shortcut of another brush if you select a shortcut that is already assigned.

Color

Action Key(s)
Select Color under cursor C
Switch Color V

Stroke

Action Key(s) Notes
Lazy mouse L Toggles the lazy mouse mode.
Replay Last Stroke 1 This is very handy to use after pressing
CTRL, and moving a subtool to duplicate it. Pressing 1 will create yet another duplicate, moving it
the same distance on the same axis as before. So, this is a great way to create an array of equally spaced
duplicates.
Record Stroke 3
Replay All Recorded Strokes 2

Curves

Action Key(s)
Smooth curve 6
Snapshot curve 5
Delete a curve ALT + draw across curve

3D Models

Action Key(s) Notes
Save Tool SHIFT +
CTRL +
T
Frame (Fit Mesh To view) F (You may need to press it twice.)
Dynamic Persp (Perspective Distortion) P
Floor Grid SHIFT +
P
Activate Symmetry X
Show/hide Polyframe & polygroups SHIFT +
F
Point Selection Mode SHIFT +
CTRL +
P
Set Pivot Point CTRL +
P
Clear Pivot Point SHIFT +
P
Snapshot a version to canvas SHIFT +
S

Edit mode Navigation

The following actions apply when in Edit Object (Key: T) mode.

Note: For best results turn off RightClick Navigation in the Preferences > Interface menu.

Action Key(s)
Frame (Fit Mesh to View) F
Move (Move Edited Object) ALT + click and drag Background
Zoom3D (Scale Edited Object) ALT + click on background, release
ALT, then drag
Free Rotate click + drag on background
Constrain to 90-degree rotation click + drag on background and then press
SHIFT
Rotate around Z-axis SHIFT, click on background, release
SHIFT, drag
Scale ALT + click, release
ALT, drag Background

SubTools

List all SubTools – N

ALT + click on SubTool – select that SubTool

SHIFT + ALT + click on selected SubTool – frame that SubTool (Note this option can be set in the Preferences > Edit > Enable Auto Center slider; 0 = off; 1 = Alt + click; 2 = SHIFT + Alt + click)

Click on paintbrush icon – toggle Polypaint Colorize

SHIFT + click on paintbrush icon – toggle Polypaint Colorize for all SubTools

Geometry

Action Key(s) Notes
Divide CTRL +
D
Lower Res SHIFT +
D
Higher Res D
Edge Loop CTRL +
E
(partially hidden mesh)

Dynamesh

Remesh Dynamesh sculpt – in Edit > Draw mode CTRL + drag Background

HD Geometry

Action Key(s) Notes
Toggle in/out of HD Sculpting mode A (cursor over mesh)
Render all HD Geometry A (cursor over background)

Masking

Action Key(s) Notes
View mask CTRL +
H
Invert mask CTRL +
I
Mask all CTRL +
A
Select masking Brush hold

CTRL
 while selecting brush from popup
Paint mask on object (alphas/strokes can be used) CTRL (hold down)
Delete or paint reverse mask CTRL +
ALT (hold down)
Reverse mask CTRL + click background a.k.a. Flip Mask, Invert Mask
Clear mask CTRL + click + drag background
Constant-intensity mask CTRL + click, release
CTRL, drag (starting off mesh)
Alpha-intensity mask (using MaskPen or MaskRect brush) CTRL + click & drag (select alpha while holding
CTRL)
Blur mask CTRL + click on mesh When a mask has been drawn on a mesh, this action blurs (softens) the edges of the mask.
Sharpen mask CTRL +
ALT + click on mesh

Topological Masking

in Move, Scale or Rotate mode – CTRL + click + drag the action line on the model

Polygroups

Action Key(s)
Group Masked and Clear Mask CTRL +
W
This is super handy! Basically, it turns anything you have masked into a polygroup and then clears the mask.
In other words, if you want to turn the currently masked area into a polygroup, press
CTRL +
W.

Partial Mesh Visibility & Clip Brushes

Action Key(s)
Select Selection or Clip Brush hold
SHIFT +
CTRL while selecting brush from popup
Show mesh portion SHIFT +
CTRL + click, release keys & drag (green selection area)
Hide mesh portion SHIFT +
CTRL + click, release keys & drag – press Alt (red selection area)
Grow mesh portion CTRL +
SHIFT +
X
Shrink mesh portion CTRL +
SHIFT +
S
Grow all mesh portion CTRL +
SHIFT +
A
Outer Ring visibility CTRL +
SHIFT +
O
Move selection or clip area press
SPACE without releasing mouse/pen
Show entire mesh SHIFT +
CTRL + click background
Show only selected Polygroup (on fully visible mesh) SHIFT +
CTRL + click
Hide selected Polygroup (on fully visible mesh) SHIFT +
CTRL + click twice
Hide selected Polygroup (on partially visible mesh) SHIFT +
CTRL + click
Reverse visibility SHIFT +
CTRL + click & drag background
Hide edge loop with Lasso option selected,
SHIFT +
CTRL + click on edge that crosses loop
ClipCurve add soft direction change press
ALT once
ClipCurve add sharp direction change press
ALT twice
reverse clip area ALT (hold down)

Stencil

Action Key(s)
Stencil On ALT +
H
Hide/Show Stencil CTRL +
H
Coin Controller SPACE

ZSpheres

Action Key(s)
Preview Adaptive Skin A

ZSpheres – Draw mode

Action Key(s) Notes
Add a child ZSphere drag ZSphere
Delete ZSphere ALT + click ZSphere
Add a child ZSphere at same size click + drag, press
SHIFT
Add a child ZSphere and scale Link Spheres click + drag to size new ZSphere, press
CTRL + drag
Insert ZSphere click Link-Sphere
Sphere Define magnet/ break meshio ALT + click Link-Sphere (with Tool > Adaptive Skin > Use ClassicSkinning on)

ZSpheres – Move mode

Action Key(s)
Move ZSphere drag ZSphere
Pose (Natural-linked move) drag Link-Sphere
Move Chain Alt + drag Link-Sphere

ZSpheres – Scale mode

Action Key(s)
Scale Zsphere drag ZSphere
Inflate/deflate chain ALT + drag Link-Sphere
Scale chain drag Link-Sphere

ZSpheres – Rotate mode

Action Key(s)
Spin chain drag ZSphere
Control twist ALT + drag Link-Sphere
Rotate chain drag Link-Sphere

ZSpheres – ZSketch

Action Key(s)
Activate ZSketch Edit mode SHIFT +
A (with a ZSphere armature in Edit mode)
Preview Unified Skin A

Canvas and 2.5D

Action Key(s)
Reverse 2.5D brush effect ALT (hold down)
Crop And Fill SHIFT +
CTRL +
F
Grab Texture From Document SHIFT +
CTRL +
G

Document Layers

Action Key(s)
Clear Layer CTRL +
N
Fill Layer CTRL +
F
Bake Layer CTRL +
B
On Layer thumbnail, toggle all layers on/off SHIFT + CLICK
Select layer on which clicked pixol resides ~ + click canvas (US)
@ + click canvas (UK)
Move layer contents up/down/sideways (X & Y) ~ + drag (US)
@ + drag (UK)

Markers

Markers will only show when Edit is turned off

Action Key(s)
Remove Marker CTRL +
M

Canvas Zoom

Action Key(s)
Actual Size 0
Antialiased Half Size CTRL +
0
Zoom In +
Zoom Out -

Timeline

Action Key(s) Notes
Place a new key frame click on the Timeline
Select an existing key frame click on the key frame dot
Zoom Timeline in/out click on selected key frame dot
Move selected key frame click + drag dot to new position (dragging off end will delete)
Store new data in existing key frame SHIFT +
CTRL + click on the key frame dot
Delete a key frame click + drag dot off the Timeline
Copy selected key frame SHIFT + click on the Timeline at the point where you want the copy
Copy multiple key frames SHIFT + click on all the key frames dots to be copied, then
SHIFT + click the Timeline
at the point where you want the copies
Create Transition key frame CTRL + click on an existing key frame dot
Create Rigid key frame ALT + click on an existing key frame dot
Go to Previous Camera key frame LEFT ARROW
Go to Next Camera key frame RIGHT ARROW
Play the Timeline SHIFT+click on the Timeline cursor (will play as a loop)
Stop the Timeline playing ESC
Record Timeline as a Movie SHIFT +
CTRL + click on the Timeline cursor
(set the cursor to the start first using the LEFT ARROW)

Movie

Action Key(s)
Snapshot to Movie CTRL +
SHIFT + ! (US)
SHIFT +
CTRL + PageUp (UK)

Render

Action Key(s)
Best Preview Render (BPR) SHIFT +
R
Render All SHIFT +
CTRL +
R
Cursor Selective Render CTRL +
R

Custom UI and Configuration

Action Key(s) Notes
Move item to custom interface position CTRL +
ALT + drag
 (when Enable Customize is switched on)
Remove item from custom interface position CTRL +
ALT + drag to Canvas
(when Enable Customize is on)
Store Configuration File SHIFT +
CTRL +
I
Load User Interface Configuration File CTRL +
L
Save User Interface Configuration File SHIFT +
CTRL +
ALT +
I

ZScripts

Action Keys
Load ZScript SHIFT +
CTRL +
L
Reload ZScript CTRL +
U
Show/Hide ZScript window H

Reference Resources

Polygroups allow you to organize a single mesh with visual grouping information. Press SHIFT + F or press the Draw Polyframe button as shown selected in orange below to see the polygroups. Notice that the example image has six different polygroups as depicted with different colors.

Normally, polygroups display sections of a single mesh. If you want to convert polygroups into SubTools you can do the following.

If your model has different elements go to Tool > Polygroups and select Auto Groups. You can then go to SubTools > Split and click Groups Split. Groups Split will be disabled unless all polygroups are visible on the canvas (press CTRL + SHIFT and click an empty area of the canvas to display all polygroups).

When you want to merge all the stuff again just make each SubTool visible and pick SubTool > Merge > Merge Visible. ZBrush will create a new tool with all the former SubTools together again. Note that in merge visible you have an option for weld verts.

Warning: When you merge visible SubTools you will lose sublevels and the merged new tool is created with every SubTool at the current level. (At this moment, I don’t really know what this means, but it seemed like a relevant note, so I’m keeping it until I find out and can clarify the statement.)

This tutorial demonstrates a quick and simple way to create clothing in ZBrush by extruding a polygroup out from a Subtool.

Mask an area on the SubTool by holding down CTRL and painting on the Subtool.

In the Polygroups palette, click > Group Masked

Press CTRL + SHIFT and click the new polygroup to select it.

Under Geometry, make sure you have no subdivisions; the panel loop feature will not work on models with subdivisions. Remove subdivisions if it has them.

In the Geometry palette, expand the EdgeLoop section.

Click the Append button, which is just to the right of the Panel Loops button. This will create a back-face for your mesh so that you can separate it off and your mesh can have thickness without cutting a hole into the body underneath.

Increase thickness slightly with the Thickness slider. Try 0.02 for thickness, for example.

Click the Panel Loops button to see what you get.

CTRL + Z to undo an unwanted result and keep adjusting your thickness to what’s desired.

Now, if you turn on Polyframe mode, you’ll notice that the clothing item is its own new group with another polygroup at the edge(s).

If you want to get rid of the extra polygroup on the edge(s), you can go to Polygroups palette and click the Auto Groups button.

You can now CTRL + SHIFT + click on the new polygroup in order to isolate it.

Go to Subtools palette, expand the Split section, and click the Split Hidden button.

Now the item and the body from which you started are now two separate objects (two separate Subtools)

In the brush palette, you can go to Auto Masking and set Mask By Polygroups to 100. This will setup an automatic masking so that when you use a brush, it will only affect the polygroup.

To try this, press CTRL and paint a mask on an object.

Press CTRL + W to turn the masked area into a polygroup.

Select the Move brush ( B + M + V )

In the Brush palette, under Auto Masking, set Mask By Polygroups to 100

Now, when you use the move brush, it will only move the polygroup because everything else is auto-masked.