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.