Are you sure you are outputing a objectspace normalmap?

Try the generator class, to make your normalmap.
If it looks good, that's probably because you export your map as tangent normalmaps. the z information is used/applied another way, and I think that's what is happening here.
not sure tho...

note that tangent maps will be supported soon

Fabrice




On Jan 20, 2009, at 9:28 PM, zhil wrote:


Hi there!
I have created simple application, which load normal map, simple
texture and shirt model, but for some reasons it looks pretty strange
- like if normal map was inverted for some reason (showing dark
instead of light and vice verse)

Online demo here
http://files.rightinpoint.com/tailor_65s6d562/tailor2.html

Source model
http://files.rightinpoint.com/tailor_65s6d562/shirt4.jpg

Source code

package {
        import flash.display.*;
        import flash.events.*;
        import flash.net.*;
        import away3d.core.*;
        import away3d.events.*;
        import fl.controls.List;
        import fl.data.DataProvider;

        import away3d.core.base.*;
        import away3d.containers.*;
        import away3d.primitives.*;
        import away3d.materials.*;
        import away3d.loaders.*;
        import away3d.cameras.*;
        import away3d.core.utils.Cast;
        import away3d.events.*;
        import away3d.lights.*;

        public class Tailor2 extends Sprite {
                var view:View3D;
                var scene:Scene3D;
                var camera:HoverCamera3D;
                var objLoader:Object3DLoader;
                var obj:ObjectContainer3D;
                var objLoader2:Object3DLoader;
                var obj2:ObjectContainer3D;
                var material:Dot3BitmapMaterial;
                var _loader:Loader;
                var _loader2:Loader;
                var _bitmapData:BitmapData;
                var light:DirectionalLight3D;
                var move:Boolean = false;
                var lastPanAngle:Number;
                var lastTiltAngle:Number;
                var lastMouseX:Number;
                var lastMouseY:Number;

                var selectGroup:Sprite;
                var selectMiddle:List;

                function Tailor2() {
                        stage.frameRate=60;
                        away3dcreate();
//                      initSelect();
                }
                function initSelect() {
                        selectMiddle = new List();
                        selectGroup.addChild(selectMiddle);
                }
                function away3dcreate():void {
                        scene = new Scene3D();
                        camera = new HoverCamera3D({zoom:3, focus:200, 
distance:10000});
                        camera.targetpanangle = camera.panangle = -10;
                        camera.targettiltangle = camera.tiltangle = 20;
                        camera.yfactor = 1;
                        view=new 
View3D({scene:scene,camera:camera,x:450,y:450});
                        addChild(view);
                        _loader = new Loader();
                        
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
onLoadTextureComplete);
                        _loader.load(new URLRequest("assets/t.jpg"));
                }
                function onLoadTextureComplete(e:Event):void {
                        trace("onLoadTextureComplete");
                        _bitmapData = Bitmap(_loader.content).bitmapData;
                        _loader2 = new Loader();
                        
_loader2.contentLoaderInfo.addEventListener(Event.COMPLETE,
onLoadNormalComplete);
//                      _loader2.load(new URLRequest("assets/wp/normal.jpg"));
                        _loader2.load(new 
URLRequest("assets/normal_from_Zbrush6.jpg"));
                }
                function onLoadNormalComplete(e:Event):void {
                        trace("onLoadNormalComplete");
//                      light = new DirectionalLight3D({color:0xFFFFFF, 
ambient:0.25,
diffuse:0.85, specular:0.95});
                        light = new DirectionalLight3D({color:0xFFFFFF, 
ambient:0.15,
diffuse:0.95, specular:0.95});
                        light.x = 10;
                        light.z = 1;
                        light.y = 1;
                        scene.addChild( light );
                        material = new Dot3BitmapMaterial(_bitmapData,Bitmap
(_loader2.content).bitmapData,{});
                        //material = new 
Dot3BitmapMaterial(Cast.bitmap(TorsoImage),
Cast.bitmap(TorsoNormal));
//                      objLoader = Max3DS.load("assets/wp/men_normal_fit.3DS",
{material:material, ownCanvas:true, name:"torso", centerMeshes:true});
                        objLoader = Max3DS.load("assets/2009_01_20v2.3DS",
{material:material, ownCanvas:true, name:"torso", centerMeshes:true});
                        objLoader.addOnSuccess(objOnSuccess);
                        //objLoader2 = 
Max3DS.load("assets/collar.3DS",{material:material,
ownCanvas:true, name:"torso", centerMeshes:true});
                        //objLoader2.addOnSuccess(obj2OnSuccess);
                }
                function objOnSuccess(e:Event):void {
                        trace("objOnSuccess");
                        obj = (objLoader.handle as ObjectContainer3D);
                        autoAdjust(obj);
                        view.scene.addChild(obj);
                        camera.lookAt(obj.position);
                        initListeners();
                }
                function autoAdjust(obj:ObjectContainer3D) {
                        trace(obj.minX);
                        trace(obj.maxX);
                        trace(obj.minY);
                        trace(obj.maxY);
                        trace(obj.minZ);
                        trace(obj.maxZ);
                        
obj.movePivot((obj.minX+obj.maxX)/2,(obj.minY+obj.maxY)/2,(obj.minZ
+obj.maxZ)/2);
                        
obj.scale(10000/Math.max(Math.abs(obj.minX-obj.maxX),Math.abs
(obj.minY-obj.maxY),Math.abs(obj.minZ-obj.maxZ)));
                        obj.rotationX = 90;
                }
                function initListeners():void {
                        addEventListener( Event.ENTER_FRAME, onEnterFrame );
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, 
onMouseDown);
                        stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                }

                /**
                 * Navigation and render loop
                 */
                function onEnterFrame(event:Event):void {
                        view.camera.moveTo(obj.x,obj.y,obj.z);
                        view.camera.rotationY=mouseX/2;
                        view.camera.rotationX=mouseY/2;
                        view.camera.moveBackward(5);
                        //obj.rotationY+=1;
                        view.render();

                        if (move) {
                                camera.targetpanangle = 0.3*(stage.mouseX - 
lastMouseX) +
lastPanAngle;
                                camera.targettiltangle = 0.3*(stage.mouseY - 
lastMouseY) +
lastTiltAngle;
                        }
                        camera.hover();
                        view.render();
                }

                /**
                 * Mouse down listener for navigation
                 */
                function onMouseDown(event:MouseEvent):void {
                        lastPanAngle = camera.targetpanangle;
                        lastTiltAngle = camera.targettiltangle;
                        lastMouseX = stage.mouseX;
                        lastMouseY = stage.mouseY;
                        move = true;
                        stage.addEventListener(Event.MOUSE_LEAVE, 
onStageMouseLeave);
                }

                /**
                 * Mouse up listener for navigation
                 */
                function onMouseUp(event:MouseEvent):void {
                        move = false;
                        stage.removeEventListener(Event.MOUSE_LEAVE, 
onStageMouseLeave);
                }

                /**
                 * Mouse stage leave listener for navigation
                 */
                function onStageMouseLeave(event:Event):void {
                        move = false;
                        stage.removeEventListener(Event.MOUSE_LEAVE, 
onStageMouseLeave);
                }
        }
}

Location of the models the same as in the source.

Any ideas what could be the reason?
- problems in 3ds model (it was created in Maya, exported as obj,
imported into 3dmax, exported as 3ds)?
- problems in normal map?
- problems in lights settings in action script? I have played with
different settings, but was failed to locate reason.
- bug in away3d?

Right now I dont have any ideas how I can move forward with this bug,
so any help are welcome.

Reply via email to