I still don't get this one. Why does simple var model:Object3D = Obj.parse(new ModelObjFile()); model.material = Cast.material(new TextureFile()); does not work (there's no material property anymore)?
Is there something that does work along these lines? I DO NOT want to touch materialLibrary. On Aug 11, 8:55 pm, "Joshua Granick" <[email protected]> wrote: > Hi everyone, > > I recently updated to the latest revisions of Away3D, and I lost the > ability to set an object's material at runtime. > > This may or may not be obvious to others, but I wanted to share how this > works in the latest versions. Many of the examples I've seen are either > for loading a mesh (Collada, 3DS, BSP, etc) and relying on Away3D's built > in loader for textures, or they use an Away3D primitive (Cube, Plane, > Sphere, etc) and set the material property. Personally, I prefer to either > load textures myself, or embed them in my classes (the Embed meta tag is > blocked in Flash Professional, but should work with FlashDevelop or Flash > Builder). Either way, I like to apply textures at runtime myself. > > Doing this before was pretty simple. It looked like this: > > var object:Object3D = Collada.parse (Mesh, { material: Texture } ); > > If Mesh and Texture were classes, containing embedded geometry and bitmap > data, Away3D would put them together automatically. Of course, if you > wanted to use a different material, or customize it a bit more, you could > also pass your own material, like these examples: > > var object:Object3D = Collada.parse (Mesh, { material: new BitmapMaterial > (Cast.bitmap (Texture), { smooth: true } ) } ); > > var object:Object3D = Collada.parse (Mesh, { material: new > WireColorMaterial () } ); > > However, in the latest versions of Away3D, this no longer works. It will > ignore the material property entirely, loading either the default flat > texture, or using the built-in loader to try and download and display an > image texture. That doesn't work for me, so I went looking around for how > I could (again) merge my meshes and textures like I wanted. Here's how: > > var parser:Collada = new Collada ( { material: new WireColorMaterial () } > ); > var object:Object3D = parser.parseGeometry (Mesh); > > That will override all the materials defined in the Collada, and replace > it with a new material. If you need more control over the process, you can > also do something like this: > > var parser:Collada = new Collada (); > var object:Object3D = parser.parseGeometry (Mesh); > > object.materialLibrary.getMaterial ("lambert1").material = new > WireColorMaterial (); > > for each (var materialData:MaterialData in object.materialLibrary) { > > if (materialData.name == "lambert1") { > > materialData.material = new WireColorMaterial (0xFF0000); > > } else { > > materialData.material = new WireColorMaterial (0x00FF00); > > } > > } > > One of the things I like most about setting either a single material at > runtime, or iterating through the material library is that you don't need > to remember the names of all your materials. If you have five models which > need the same material, you don't need to remember if one was named > "lambert1" and the other was named "lambert2". > > All in all, I like this way of parsing better than how I did it before. > This feels closer to Away3DLite, and it makes it easy to swap out the > parser. Since my old approach used the public static method to parse, it > meant that I needed to know beforehand which format the mesh was in. > However, with the new approach, I could easily create a loader that > supports multiple model formats, like this: > > public function loadObject (mesh:Class, material:Material, > parser:Class):Object3D { > > return new parser ( { material: material } ).parseGeometry (mesh); > > } > > So that's that! I know I was a little stuck figuring out how to do this, > both the first time, and the second time. I hope this helps someone!
