Inka3D

Inka3D

Contents

Installation

API

Export options

Supported Maya Features

Limitations

Installation

Maya plugin

1) Unpack the .zip archive

2) Windows only: Install Visual Studio 2010 redistributable

3) Copy maya directory over your user maya directory

Windows 7 C:\Users\<your user account>\Documents\maya
english Windows XP C:\Documents and Settings\<your user account>\My Documents\maya
german Windows XP C:\Dokumente und Einstellungen\<your user account>\Eigene Dateien\maya
Mac OS X /Users/Shared/Autodesk/maya

4) Open Maya or restart it

5) Load the plugin "Inka3D" in Maya via Window -> Settings/Preferences -> Plug-in Manager

First test

1) Set the project to the examples folder and open an example

2) Export using File -> Export All... (Maya 2010 and below: click on square)

3) Select File type: Inka3D HTML/WebGL Exporter

4) Select the following export options (File Type Specific Options)

Interface Nodes None
List of Nodes leave empty
Interface Transforms unchecked
Interface Locators unchecked
Interface Cameras checked
Interface Lights unchecked
Export Render Layers unchecked
Add Pick Layer unchecked
No Bump Mapping unchecked
No Pixel Processing unchecked

Note: a camera shape named “cameraShape1” must be present.

5) Export to the WebGL directory (contained in the .zip archive) as test.html

6) Start InkaServer inside WebGL directory (do it inside a console as double-clicking from explorer/finder starts it with some other directory as current directory)

7) Go to http://localhost/test.html or http://localhost:8080/test.html (see output of InkaServer)

8) If you change the .html file and your scene you can export the .js file using Inka3D JavaScript/WebGL Exporter so that your changes in the .html file don't get overwritten. Repeat step 4 to set the export options, export and then hit the reload button in your browser.

Troubleshooting

Maya plugin does not load: Install Visual Studio 2010 redistributable (32/64 bit depending on your Maya version).

When exporting maya says Cannot find procedure "Inka3DOptionsDirect": Restart Maya. If it does not help, Inka3DOptionsDirect.mel may be missing in maya/<version>/scripts directory. Repeat step 3 of installation and make sure to copy the whole maya directory, not only the plugin itself.

Install new graphics driver. Maybe yours is blacklisted by your browser.

Make sure you use a HTTP server (e.g. InkaServer) to view exported content as loading from file may not work.

Scene loading stops at progress bar: set "Interface Cameras" export option and make sure cameraShape1 is present in your scene.

Other strange behavior: In the header of the exported html file after

<script type="text/javascript" src="js/inka3d.js"></script>
		
add this line:
<script type="text/javascript" src="js/inka3dDebug.js"></script>
		
Then open a javascript debug console.

Rendering is slow or has low resolution: check current zoom factor of your browser. Should be 100%.

API

HTML Header

In the head section of your html include the following javascript files:

<script type="text/javascript" src="js/webgl-utils.js"></script>
<script type="text/javascript" src="js/inka3d.js"></script>
		
Also include your exported scene:
<script type="text/javascript" src="MyScene.js"></script>
		
If you use the Inka3D HTML/WebGL exporter then a simple HTML wrapper file is created for you.

Initialization

Renderer and render groups

In the script code, first create a renderer with given number of render jobs, e.g.

renderer = digi.createRenderer(100);
		
You need as many render jobs as you render shapes. If you use geometry instancing, i.e. render an object per particle, you need one render job for every particle. If the particle system has a maximum of 500 particles you should pass 600 here. If rendering starts flickering or you don't see all objects you probably have too few render jobs. The next thing to do is to create a render group
group = renderer.createGroup();
		
This is a collection of scenes you want to render at a time. At first one group should be enough, but you can do things like overlays with it. Render one group, clear the z-buffer and then render another group.

Start loading

Now initialize the exported scene (or collection of exported scenes - creating scene collections requires an extra tool that is available on request). Call init() on the scene
MyScene.init();
		
Now the scene starts loading asynchronously.

Observing load progress

The scene has an attribute called numLoaded which tells you how many resources (e.g. textures) are already loaded and an attribute called numResources that tells you how many resources there are to load. With this you can create a loading bar or other progress display. The code could look like this:

var progress = (MyScene.numLoaded + 0.5) / MyScene.numResources;
if (progress < 1)
{
	// continue waiting...
	requestAnimFrame(waitLoad);
	
	// display loading bar or percentage
	...
}
else
{
	// loading finished

	// init gl
	gl.clearColor(0, 0, 0, 1);
	gl.enable(gl.DEPTH_TEST);
	
	// create scenes
	...
}
		

Creating scenes

Now that the loading has finished we can create an instance of a scene in our render group:

scene = MyScene.createScene("MyScene", group);
		
It is possible to do this more than once in the same group or different groups.

Interfacing scenes

There are several methods to access the attributes of a scene. The names of the attributes are the same as in Maya. To find out the name of an attribute, simply modify it in Maya and look for the output in the script editor. Then copy-and-paste the name (e.g. "pcube1.translate") to your javascript editor. These methods can be used to access attributes:

getIntVector(name, length) returns Int32Array if attribute has given length
getIntArray(name) returns Int32Array for attribute
getFloatVector(name, length) returns Float32Array if attribute has given length
getFloatArray(name) returns Float32Array for attribute
getTexture(name) returns WebGL texture object
getTexture(name, index) returns WebGL texture object of texture sequence
setTexture(name) sets WebGL texture object
setTexture(name, index) sets WebGL texture object of texture sequence

The returned arrays of type Int32Array or Float32Array can be stored and then used to read and write attributes very fast. Attributes of scalar type are accessed with typed arrays of length 1.

Now we can extract the global animation time attribute from the scene:

sceneTime = scene.getFloatVector("time", 1);
		
We can use a Maya camera for rendering by finding its world matrix and projection attributes:
sceneCameraMatrix = scene.getFloatVector("cameraShape1.worldMatrix[0]", 16);
sceneProjection = scene.getFloatArray("cameraShape1.projection");		
		
Search for "parameterInfos:" in the exported .js file to see which attributes are available. If the attribute you are looking for is missing, check the export options while exporting from Maya.

Setting attributes

You can set scalar or vector attributes by simply assigning a value using the array operator ([...]). For example for the sceneTime this could be

sceneTime[0] = new Date().getTime() / 1000.0 - startTime;
		

Getting attributes

You can query the current state of attributes. Scalar or vector attributes are read by using the array operator ([...]). For example you can get the current scene time by

var currentTime = sceneTime[0];
		
To use a camera that is in your Maya scene for rendering, you use the current state of sceneCameraMatrix and sceneProjection by
digi.matrix4x4Inv(sceneCameraMatrix, viewMatrix);
digi.matrix4x4Projection(sceneProjection, aspect, projectionMatrix);
		
Where viewMatrix and projectionMatrix are a Float32Array of length 16 that can be allocated once in the initialization code.

Main loop

It is your responsibility to create a main loop. This way you can set a render target and apply postprocessing as you like. A typical main loop looks like this: set attributes, update, calculate viewMatrix and projectionMatrix, clear screen, render.

Update

After you have set all attributes, update the scenes by using

group.update();
		
This recalculates all world transformations, all animations and all other dependent attributes.

Rendering

Rendering is done on a render group. A view matrix, a projection matrix and a render layer name are passed to the render function:

group.render(viewMatrix, projectionMatrix, renderLayer);
		
The renderLayer parameter selects a render layer of your Maya scene. Use "color" if you don't use render layers.

Picking

To find out which object is under the mouse curser you can use getObjectId(name) on a scene in the init function to get an id for an object. Use the name of a shape in your scene with the instance index in square brackets, e.g.

var cubeId = scene.getObjectId("pCubeShape1[0]");
		
Then, in the main loop, use the pick function on a render group. You also have to pass a view and projection matrix which can be the same as for rendering. Also pass the mouse coordinates in device space, i.e. ranging from -1 to 1 over your viewport. The (-1, -1) point is the lower left corner, (0, 0) is the center.
var id = group.pick(viewMatrix, projectionMatrix, mouseX, mouseY);
		
Now if id equals cubeId the cube was picked.

Export options

Interface Nodes

This option tells the exporter which nodes are visible in the interface and therefore if their attributes can be modified by Javascript. You can select all, a list of nodes or none. The list of nodes is a list of comma (',') or semicolon (';') separated list of node names. For example if you want to interface to the attributes of a cube and a sphere, the list could be "pCube1,pSphere1". It is beneficial to interface to as few nodes as possible as this increases performance and reduces file size. You can bring together all attributes of a scene that you want to control by adding extra attributes to one node and connect these to the attributes in the scene. Hint: Search for "parameterInfos:" in the exported .js file to see which attributes are in the interface. Try to keep the list short if you want to optimize.

Interface Transforms

All attributes of all transform nodes are visible in the interface in addition to the other settings. Some scenes contain thousands of transform nodes which will result in very long export times when this option is on.

Interface Locators

All attributes of all locators are visible in the interface in addition to the other settings.

Interface Cameras

All attributes of all camera nodes are visible in the interface in addition to the other settings. Cameras have the special attribute projection (e.g. "cameraShape1.projection") that contains the camera projection attributes such as Focal Length, Near/Far Clip Plane, Camera Aperture, Film Aspect Ratio, Fit Resolution Gate and Orthographic. From this a projection matrix can be calculated using the screen aspect ratio.

Interface Lights

All attributes of all light nodes are visible in the interface in addition to other settings.

Export Render Layers

Maya's render layers get exported. With this you can selectively render indivitual parts of the scene as the render function takes a render layer name. By default the layer named "color" is rendered. If you create a layer named "color" you can control which objects are rendered. Also the picking can be controlled using a render layer named "pick". All objects that are in the pick layer are pickable. With this you can define an invisible plane for picking or exclude objects from picking.

Add Pick Layer

A pick layer is generated in the output code even if no pick layer is defined in the scene. If Export Render Layers is on and a layer named "pick" exists then all objects in this layer are pickable. Ohterwise all objects are pickable.

No Bump Mapping

Omit bump mapping of all shaders. Useful for low-end targets such as tablets.

No Pixel Processing

Simplifies the pixel shaders by doing most calculations in the vertex shader. Quality degrades more or less dependent on shader. For example ramp textures are evaluated per vertex. Useful for low-end targets such as tablets.

Supported Maya Features

Scene

AnimCurve

Standard animation curve, created when using „Set Key“. All tangent types are supported except Stepped Next.

Expression

All C-Like constructs supported. Example:

if (pCube1.rotateX > 30.0)
{
	pCube1.translateX = sin(0.5 * time);
}
else
{
	pCube1.translateX = pCube1.translateZ;
}
		

Object types and lists are not supported.

Limit functions:

abs(x) Absolute value: abs(-1) → 1
ceil(x) Round up: ceil(0.1) → 1
floor(x) Round down: floor(0.9) → 0
clamp(min, max, x) Clamp
min(x, y) Minimum
max(x, y) Maximum
sign(x) Sign: -1, 0 or 1
trunc(x) Truncate: trunc(1.5) → 1, trunc(-1.5) → -1

Exponential functions:

exp(x) e^x
log(x) Logarithm base e
log10(x) Logarithm base 10
pow(x, y) x^y
sqrt(x) Square root

Trigonometric functions:

cos(x) Cosine
cosd(x) Cosine taking degrees
sin(x) Sine
sind(x) Sine taking degrees
tan(x) Tangent (sin(x)/cos(x))
tand(x) Tangent taking degrees
atan2(y, x) Arc tangent
atan2d(y, x) Arc tangent returning degrees
hypot(x, y) Length of 2D vector (x, y)

Vector functions:

angle(x, y) Angle between two vectors
cross(x, y) Cross product
dot(x, y) Dot product
mag(x) Length of vector
unit(x) Normalized vector, unit length

Random functions:

gauss(stdDev) 1D or 3D random numbers with Gaussian distribution
gauss(stdDevX, stdDevY) 2D random numbers with Gaussian distribution
noise(x) 1D or Perlin scalar noise
noise(x, y) 2D Perlin scalar noise
noise(vector) 3D Perlin scalar noise
dnoise(vector) 3D Perlin vector noise
rand(maxValue) 1D or 3D random numbers in the range 0 to maxValue
rand(minValue, maxValue) 1D or 3D random numbers in the range minValue to maxValue
sphrand(radius) 3D random numbers inside a sphere or ellipsoid

Curve functions:

linstep(start, end, parameter) Linear step from 0 to 1
smoothstep(start, end, parameter) Smooth step from 0 to 1
hermite(p1, p2, tan1, tan2, alpha) Hermite spline with tangents tan1 and tan2

Camera

Defines view and projection matrix.

focalLength Animatable
nearClipPlane Animatable
farClipPlane Animatable
cameraAperture Animatable
filmOffset Animatable
orthographic Constant
orthographicWidth Animatable

Camera Aperture defines the film size in inch, film Offset is also in inch.

When Orthographic is enabled, Focal Length, Camera Aperture and Film Offset have no effect in Maya.

Joint

A Skeleton is made up of joints

translate Animatable
rotate Animatable
scale Animatable
rotateOrder Constant
roateAxis Constant
inheritsTransform Constant
jointOrient Constant
visibility Animatable

Look At

Look At controller for camera

offset Constant
aimVector Constant
upVector Constant
worldUpType Constant
worldUpVector Animatable
twist Animatable

Twist only works for World Up Type = Scene or Vector.

Transform

Basic transform node

translate Animatable
rotate Animatable
scale Animatable
shear Animatable
rotateOrder Constant
roateAxis Constant
inheritsTransform Constant
rotatePivot Constant
scalePivot Constant
visibility Animatable

Geometry

Blend Shape

WebGL: will exceed maximum vertex inputs for more than one target.

One mesh per blend target is supported.

Mesh

Fully supported. Automatic triangulation is done on polygons, but the quality of Maya's triangulation may be better. Automatic vertex cache optimization is performed.

visibility Animatable

Sine Deformer

amplitude Animatable
wavelength Animatable
offset Animatable
lowBound Animatable
highBound Animatable

Skin Cluster

A maximum of 8 bones per vertex is the limit for performance reasons but can be extended on request.

Shading

Note: Maya defines transparency separately for all three color channels. Inka3D currently only uses the red component as monochrome transparency since current hardware shaders support only monochrome transparency. Maya applies the transparency to a pixel in the render target as follows:

Pixel = Transparency * Pixel

+ (1 – Transparency) * (Sum of Lights + Ambient Color) * Surface Color

+ Incandescence

Lambert

color Animatable, Texture
transparency Animatable, Texture (See Note)
ambientColor Animatable, Texture
incandescence Animatable, Texture
bumpMapping Tangent Space Normal Texture

Phong

Inherits Lambert

cosinePower Animatable, Texture
specularColor Animatable, Texture
reflectivity Animatable, Texture
reflectedColor Animatable, Texture

PhongE

Inherits Lambert

roughness Animatable, Texture
highlightSize Animatable, Texture
whiteness Animatable, Texture
specularColor Animatable, Texture
reflectivity Animatable, Texture
reflectedColor Animatable, Texture

Blinn

Inherits Lambert

eccentricity Animatable, Texture
specularRollOff Animatable, Texture
specularColor Animatable, Texture
reflectivity Animatable, Texture
reflectedColor Animatable, Texture

Anisotropic

Inherits Lambert

angle Animatable, Texture
spreadX Animatable, Texture
spreadY Animatable, Texture
roughness Animatable, Texture
fresnelIndex Animatable, Texture
specularColor Animatable, Texture
reflectivity Animatable, Texture
reflectedColor Animatable, Texture
anisotropicReflectivity Not Supported, always off

Surface Shader

The surface shader is mainly for head-up-displays and therefore no lighting is applied to it. As a special feature all file textures that are only used by the surface shader do not get mipmaps.

outColor Animatable, Texture
outTransparency Animatable, Texture

Fog

Settable via Render Settings window, Maya Software tab, Render Options, Post Processing.

color Animatable
saturationDistance Animatable
useHeight Constant
minHeight Animatable
maxHeight Animatable
distanceClipPlanes Constant
fogNearDistance Animatable
fogFarDistance Animatable

Lighting

When light parameters are connected to a Texture, these projections are used:

Ambient Light Spherical-Cylindrical
Directional Light Planar
Point Light Projective
Spot Light Spherical

Ambient Light

color Animatable, Texture
intensity Animatable, Texture
ambientShade Animatable

Directional Light, Point Light

color Animatable, Texture
intensity Animatable, Texture
emitDiffuse Constant
emitSpecular Constant
decayRate Constant

Spot Light

color Animatable, Texture
intensity Animatable, Texture
emitDiffuse Constant
emitSpecular Constant
decayRate Constant
coneAngle Animatable
penumbraAngle Animatable

Texturing

All textures have a 'Color Balance' section that can be used to modify the output:

defaultColor Animatable, Texture
colorGain Animatable, Texture
colorOffset Animatable, Texture
alphaGain Animatable, Texture
alphaOffset Animatable, Texture
alphaIsLuminance Constant

If Alpha Is Luminance is on, the outAlpha output is the luminance of the color component and the outTransparency output is the inverse luminance of the color component

From 'Effects' these attributes can be used:

invert Constant

File Texture

References a texture by its file name.

imageName Constant
useImageSequence Constant
imageNumber Animatable
frameOffset Animatable
uvCoord UV, Texture
outColor Output
outAlpha Output
outTransparency Output

Animated textures are created by setting „Use Image Sequence“. Then right-click on Image Number and edit the script if necessary. The image sequence must be of the format name.#.ext (preferred) or name#.ext where # is the value of the frameExtension attribute of the file texture.

Example for image sequence:

MyAnimation.0.png

MyAnimation.1.png

MyAnimation.2.png

MyAnimation.3.png

Example expression for cyclic texture animation that changes once per second:

file1.frameExtension = time % 4;
		

As a special feature there is the distinction between normal and surface textures. Surface textures are textures that are used only by the Maya surface shader. Normal textures are rescaled to power of two, i.e. an image of 800x600 is rescaled to 512x512. The resolution of surface textures is arbitrary, but if it is not power of two it is clamped at the borders due to a limitation of WebGL. This is summarized in the following table:

Texture type Resolution Action Mode
Standard Power of two Create mipmaps Repeat
Standard Non power of two Rescale to power of two, create mipmaps Repeat
Surface Power of two None Repeat
Surface Non power of two None Clamp

Possible power of two values for texture resolutions are: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096

Ramp Texture

Supported ramp types:

V Ramp
U Ramp
Diagonal Ramp
Radial Ramp
Circular Ramp
Box Ramp

Supported interpolation types:

None
Linear

Attributes:

uvCoord UV, Texture
outColor Output
outAlpha Output

Checker Texture

color1 Animatable, Texture
color2 Animatable, Texture
contrast Animatable, Texture
uvCoord UV, Texture
outColor Output
outAlpha Output

Bulge Texture

uWidth Animatable, Texture
vWidth Animatable, Texture
uvCoord UV, Texture
outColor Output
outAlpha Output

Layered Texture

All blend modes are supported.

Parameters per blend stage:

color Animatable, Texture
alpha Animatable, Texture
blendMode Constant
layerIsVisible Constant
outColor Output
outAlpha Output

Place2dTexture

coverage Animatable, Texture, Correct when >= 1.0
translateFrame Animatable, Texture
rotateFrame Animatable, Texture
mirrorU Constant
mirrorV Constant
wrapU Constant
wrapV Constant
stagger Constant
repeatUV Animatable, Texture
offset Animatable, Texture
rotateUV Animatable, Texture
noiseUV Not supported
uvCoord Output

Env Ball

Environment ball. The environment is captured on a texture by taking a picture of a reflective ball that is inside the environment. The objects are given the appearance of the ball.

eyeSpace Contant
reflect Must be on
outColor Output

Env Sphere

Environment sphere. The environment is created by mapping a texture on an infinitely large sphere. The reflection vectors on an object do a texture lookup on this sphere.

flip Contant
outColor Output

UV Chooser

Chooses the UV set for following texture in the shading network. To create/edit UV choosers use Window → Relationship Editors → UV Linking.

Vertex Colors

Vertex colors are supported via the Mental Ray vertex colors node. Use the mental ray renderer in maya to preview the result. Only red, green and blue of the vertex colors are exported, not the alpha channel.

mentalrayVertexColors

cpvSets[ ] Constant
defaultColor Animatable, Texture
colorGain Animatable, Texture
colorOffset Animatable, Texture
alphaGain Animatable, Texture
alphaOffset Animatable, Texture
alphaIsLuminance On
invert Constant
outColor Output
outAlpha Output

Particle Sampler

Particle attributes can be accessed inside a shading network with the particleSamplerInfo node. Currently only the uv output can be taken from the normalized age of the particles.

outUvType Normalized Age
inverseOutUv Constant

Use the particle sampler to animate the transparency or color of sprite particles over their life time. For example you can create a ramp texture, delete the place2dTexture node and connect outUvCoord of the particleSamplerInfo to uvCoord of the ramp texture.

Utility

Utility nodes can be used in a scene or in a shading network.

Add Double Linear

input1 Animatable, Texture
input2 Animatable, Texture
output Output

Angle Between

vector1 Animatable, Texture
vector2 Animatable, Texture
angle Output
axis Output

Blend Colors

color1 Animatable, Texture
color2 Animatable, Texture
output Output

Clamp

min Animatable, Texture
max Animatable, Texture
input Animatable, Texture
output Output

Condition

firstTerm Animatable, Texture
secondTerm Animatable, Texture
operation Constant
colorIfTrue Animatable, Texture
colorIfFalse Animatable, Texture
output Output

Contrast

value Animatable, Texture
contrast Animatable, Texture
bias Animatable, Texture
outValue Output

Gamma Correct

value Animatable, Texture
gamma Animatable, Texture
outValue Output

Luminance

value Animatable, Texture
outValue Output

Mult Double Linear

input1 Animatable, Texture
input2 Animatable, Texture
output Output

Multiply Divide

input1 Animatable, Texture
input2 Animatable, Texture
output Output

PlusMinusAverage

input1D[ ] Animatable, Texture
input2D[ ] Animatable, Texture
input3D[ ] Animatable, Texture
output1D Output
output2D Output
output3D Output

Reverse

input Animatable, Texture
output Output

Sampler Info

This node works only inside a shading network. Only a few attributes are supported so far:

flippedNormal Output
facingRatio Output

Unit Conversion

This node is usually hidden by Maya

input Animatable, Texture
output Output

Particle Systems

Particle systems can currently only be rendered using sprites (set Particle Render Type to Sprites) or an Instancer (Geometry Replacement). As particles are simulated over time using acceleration and velocity it is not possible to let the time run backwards. If you export an .html file with a time range that is too short strange things happen if the time jumps back.

Particle System

Emission Attributes

maxCount Constant, must be > 0
emissionInWorld Constant

Lifespan Attributes

lifespanMode Constant
lifespan Animatable
lifespanRandom Animatable

Time Attributes

surrentTime Animatable

Instancer (Geometry Replacement)

Supported attributes: Position, Scale, Shear, Visibility, Object Index, Rotation. Rotation Type must be None, then Maya uses the particle attribute selected in Rotation as rotation.

Render Attributes

If Particle Render Type is set to Sprites, then these attributes are supported:

spriteScaleX Animatable
spriteScaleY Animatable
spriteTwist Animatable

Per Particle (Array) Attributes

Not yet supported are Ramp Position, Ramp Velocity and Ramp Acceleration. All other attributes including custom attributes can be used in creation, before dynamics and after dynamics expression.

Instancer

rotationAngleUnits Constant
rotationOrder Constant
cycle Constant
cycleStepUnit Constant
cycleStep Animatable

Field

All particle force fields have the following attributes:

magnitude Animatable
attenuation Animatable
useMaxDistance Constant
maxDistance Animatable

Air Field

Inherits Field

direction Animatable
speed Animatable

Drag Field

Inherits Field

useDirection Constant
direction Animatable

Newton

Inherits Field

minDistance Animatable

Radial

Inherits Field

Uniform/Gravity

Inherits Field

direction Animatable

Vortex

Inherits Field

axis Animatable

Constraints and IK

Aim Constraint

Lets a node aim at a target

offset Constant
aimVector Constant
upVector Constant
worldUpType Constant (Scene Up or Vector)
worldUpVector Animatable

IK Handle

Not supported for WebGL

Only ikRPsolver supported, IK solution is different from Maya for more than one intermediate joint. The position and scale of joints in an IK chain are considered constant by the IK solver (except position of root joint).

poleVector Animatable

Orient Constraint

Transfers the orientation of one or multiple nodes to another node

offset Constant

Parent Constraint

Transfers the transformation of one or multiple nodes to another node

Point Constraint

Transfers the position of one or multiple nodes to another node

offset Constant

Pole Vector Constraint

Lets the pole vector of a IK Handle point at a node

offset Constant

Scale Constraint

Transfers the scale of one or multiple nodes to another node

offset Constant

Limitations

Number of bones 1300, float texture used if more than 75
Number of blend shapes 4
Number of polygons per mesh Limit removed in Inka3D 1.5
Sprite particle size 64 x 64 pixels in some browsers
Texture size 4096 x 4096 should not be exceeded

Meshes should be triangulated in maya as Inka3D's triangulation currently fails for concave polygons. Use Mesh->Triangulate.

User defined normals are exported only for static meshes, i.e. meshes without bones or deformers etc. This may lead to faceted apearance if the polygon edges are hard edges but only look smooth because of user defined normals.