Hello Away'ers,
I've got a question. But first I'll explain my problem.
I have to build a 3d car configurator for a school project. The car's
paint can be modified by the user on a few different levels: the
color, brightness and reflection intensity.
My current code:
package
{
import away3d.cameras.*;
import away3d.containers.*;
import away3d.core.utils.*;
import away3d.lights.PointLight3D;
import away3d.materials.*;
import away3d.core.render.*;
import flash.display.*;
import flash.events.*;
import flash3dbook.common.MonkeyMesh;
[SWF(width="800", height="600")]
public class AutoConfigurator3d extends Sprite{
[Embed(source="jazz_transparant.png")]
private var AutoTextuur : Class;
[Embed(source="jazz_nm.jpg")]
private var AutoNormals : Class;
private var _colorMaterial : ColorMaterial;
private var _autoTexMaterial : BitmapData;
private var _autoNmMaterial : BitmapData;
private var _bitmapMaterial : Dot3BitmapMaterial;
protected var _view : View3D = new View3D({camera:_camera,
renderer:Renderer.CORRECT_Z_ORDER});
protected var _camera : HoverCamera3D;
protected var _auto : HondaMesh;
protected var _auto2 : HondaMesh;
protected var _state : int = 0;
public function AutoConfigurator3d(){
_createView();
_createScene();
_createMaterials();
_createLight();
}
protected function _createView() : void{
_camera = new HoverCamera3D();
_camera.distance = 150;
_camera.tiltAngle = 10;
_view.x = 400;
_view.y = 300;
_view.camera = _camera;
addChild(_view);
stage.addEventListener(Event.ENTER_FRAME,
_onEnterFrame);
stage.addEventListener(MouseEvent.CLICK, _onClick);
}
protected function _createScene() : void{
_auto = new HondaMesh();
_auto.scale(0.005);
_auto2 = new HondaMesh();
_auto2.scale(0.004995);
_auto.invertFaces();
_auto2.invertFaces();
_view.scene.addChild(_auto2);
_view.scene.addChild(_auto);
}
protected function _createMaterials() : void {
_colorMaterial = new ColorMaterial(0xFFAA00);
_autoNmMaterial = Cast.bitmap(AutoNormals);
_autoTexMaterial = Cast.bitmap(AutoTextuur);
_bitmapMaterial = new
Dot3BitmapMaterial(_autoTexMaterial,
_autoNmMaterial);
_bitmapMaterial.specular = 0xFFFFFF;
_auto.material = _bitmapMaterial;
_auto2.material = _colorMaterial;
}
protected function _createLight():void{
var licht : PointLight3D = new PointLight3D();
licht.color = 0xFF0000;
licht.brightness = 2.0;
licht.x = 100;
licht.y = 300;
licht.z = 100;
licht.diffuse = 0.1;
_view.scene.addLight(licht);
}
protected function _toggle() : void {
switch (_state) {
case 0:
_auto.material = _bitmapMaterial;
_colorMaterial.color = 0xF00F00;
_state = 1;
break;
case 1:
_auto.material = _bitmapMaterial;
_colorMaterial.color = 0xFF0000;
_state = 2;
break;
case 2:
_auto.material = _bitmapMaterial;
_colorMaterial.color = 0xFFFF00;
_state = 3;
break;
case 3:
_auto.material = _bitmapMaterial;
_colorMaterial.color = 0x00FFFF;
_state = 0;
break;
}
}
protected function _onClick(ev : MouseEvent) : void {
_toggle();
}
protected function _onEnterFrame(ev : Event) : void {
_camera.panAngle -= (stage.mouseX - stage.stageWidth /
2) / 40;
_camera.hover();
_view.render();
}
}
}
I was hoping that this all could be altered in 1 single material, but
so far I had no luck finding a good method. (I just stumbled upon
CompositeMaterial but haven't looked into it yet)
Right now I switched to 2 models with different materials. 1 model
with a bitmapdata texture(semi transparant) showing the texture of the
car and 1 underlying model (slightly smaller scale) with a color
material. It's possible to change the color of the car now, but the
car isn't shown right. That's because the cars use ownCanvas.
So i turned that off and I tried to use the CORRECT_Z_ORDER renderer
to show the car, but this doesn't work because of the smaller scale of
the underlying model (it shows through the upper model in certain
places).
Even if i get this working correctly there is thill the issue of
applying the reflection correctly.
So here is my question. Is there a better way to solve my problem or
should I continue and try to fix my current code?