Quite a common question I see being asked is how to have a cube with a different material on each face. Currently, you can set ’tile6′ to ‘true’ which will map a texture to the UV so that it is split onto each face correctly, but it can be a bit fiddly, and also does not allow for different material types on each face, or to set different eventListeners on each face.
This class takes variables for the dimensions of the cube, and 6 materials, and creates a cube for you, from 6 correctly sized, rotated and positioned faces. At some point I intend to do this the ‘proper’ way (ie by creating a geometry class with 6 submeshes) but for the time being this works fine:
package { import away3d.containers.ObjectContainer3D; import away3d.entities.Mesh; import away3d.primitives.PlaneGeometry; /** * A quick way to create cubes with multiple material * * @author Mark Sutton */ public class multiMatCube extends ObjectContainer3D { var planesContainer:ObjectContainer3D = new ObjectContainer3D; var face1:Mesh; var face2:Mesh; var face3:Mesh; var face4:Mesh; var face5:Mesh; var face6:Mesh; public function multiMatCube(width, height, depth, face1Mat, face2Mat, face3Mat, face4Mat, face5mat, face6Mat):void { var faceGeometry:PlaneGeometry = new PlaneGeometry(1, 1, 1, 1 ) //Top face1 = new Mesh(faceGeometry, face1Mat ); face1.scaleX = width; face1.scaleZ = depth; face1.rotationX = 0 face1.y = height / 2; //Bottom face2 = new Mesh(faceGeometry, face2Mat); face2.scaleX = width; face2.scaleZ = depth; face2.rotationX = 180; face2.y = -height/2; //back face3 = new Mesh (faceGeometry, face3Mat); face3.scaleX = width; face3.scaleZ = height; face3.rotationX = 90 face3.z = depth / 2; //front face4 = new Mesh (faceGeometry, face4Mat); face4.scaleX = width; face4.scaleZ = height; face4.rotationX = 270 face4.z = -depth / 2; //right face5 = new Mesh (faceGeometry, face5mat); face5.scaleX = depth; face5.scaleZ = height; face5.rotationX = -90 face5.rotationY = -90 face5.x = width / 2; //left face6 = new Mesh (faceGeometry, face6Mat); face6.scaleX = depth; face6.scaleZ = height; face6.rotationX = -90 face6.rotationY = 90 face6.x = -width / 2; addChild(face1); addChild(face2); addChild(face3); addChild(face4); addChild(face5); addChild(face6); } } }
Using it is simple:
var newMultiCube: multiMatCube = new multiMatCube (cubeWidth, cubeHeight, cubeDepth, material1, material2, material3, material4, material5, material6);
and you can add eventListeners to each face too:
newMultiCube.face1.addEventListener(MouseEvent3D.MOUSE_DOWN, face1click);
etc..
Thanks ! Saves me typing and testing !
2 optimisations ( well three if I would add that you should enable strict typing,but I won’t
) :
- you can drop line 15, it isn’t used.
- you wanted to use subgeometries.
well you still can without extra work:
after line 78 add:
var merge:Merge = new Merge(true, false)
var mesh:Mesh = merge.applyToContainer(this)
this.addChild(mesh);
var i:int = 6;
while ( i– ) {
var face:Mesh = this["face" + (i + 1)];
removeChild(face)
face.dispose();
this["face" + (i + 1)] = null;
}
PS: I’m a newbie but I tested it and works great with preservation of materials.
Pingback: Flog! > » Blog Archive » away3d 4.0, cube with six materials and individual face meshes
Check:
http://greencollective.nl/blog/?p=54
Thanks !
Ah yes, Line 15 is a poor orphaned leftover variable… I’ll do the kind thing and get rid of the little fella…
Does your merged version still allow for an eventlistener on each face?
I have no idea about the eventlistener on individual meshes, but I came across a post on the away forum that had to do with event problems. Don’t know or this applies here to in one way or another.
I’m a 3D newbee so if you have some example code on how to add listeners, I’m glad to learn how and test it for ya.
What I do know is that when you merge the meshes into a new one, the result has less than 6 submeshes when you used similar materials multiple cubes sides, so I can imagine that it won’t work as expected ?
Cheers
I’m not totally sure about having eventlisteners on submeshes, hopefully they can be referenced as usual..
I’m going to leave this class for the time being I think, apart from deleteing the orphan variable as you suggested, and also I think I might use your naming convention for the sides, makes it easier to follow…
The ultimate aim I think would be to replace cubeGeometry.as, and construct the cube at the vertex level..