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.
