Index: /OpenSceneGraph/trunk/src/osgPlugins/obj/obj.h
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/obj/obj.h (revision 3323)
+++ /OpenSceneGraph/trunk/src/osgPlugins/obj/obj.h (revision 3325)
@@ -160,4 +160,8 @@
     void addElement(Element* element);
     
+    osg::Vec3 averageNormal(const Element& element) const;
+    osg::Vec3 computeNormal(const Element& element) const;
+    bool needReverse(const Element& element) const;
+    
     int remapVertexIndex(int vi) { return (vi<0) ? vertices.size()+vi : vi-1; }
     int remapNormalIndex(int vi) { return (vi<0) ? normals.size()+vi : vi-1; }
Index: /OpenSceneGraph/trunk/src/osgPlugins/obj/ReaderWriterOBJ.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/obj/ReaderWriterOBJ.cpp (revision 3323)
+++ /OpenSceneGraph/trunk/src/osgPlugins/obj/ReaderWriterOBJ.cpp (revision 3325)
@@ -269,6 +269,4 @@
     }
 
-    bool reverseWinding = true;
-
     if (numPolygonElements>0)
     {
@@ -285,5 +283,5 @@
                 drawArrayLengths->push_back(element.vertexIndices.size());
             
-                if (reverseWinding)
+                if (model.needReverse(element))
                 {
                     // need to reverse so add to OSG arrays in same order as in OBJ, as OSG assume anticlockwise ordering.
@@ -320,5 +318,5 @@
                         ++index_itr)
                     {
-                        vertices->push_back(model.vertices[*index_itr]);
+                        vertices->push_back(transformVertex(model.vertices[*index_itr]));
                     }
                     if (numNormalIndices)
@@ -328,5 +326,5 @@
                             ++index_itr)
                         {
-                            normals->push_back(model.normals[*index_itr]);
+                            normals->push_back(transformNormal(model.normals[*index_itr]));
                         }
                     }
Index: /OpenSceneGraph/trunk/src/osgPlugins/obj/obj.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/obj/obj.cpp (revision 3324)
+++ /OpenSceneGraph/trunk/src/osgPlugins/obj/obj.cpp (revision 3325)
@@ -463,2 +463,39 @@
     
 }
+
+osg::Vec3 Model::averageNormal(const Element& element) const
+{
+    osg::Vec3 normal;
+    for(Element::IndexList::const_iterator itr=element.normalIndices.begin();
+        itr!=element.normalIndices.end();
+        ++itr)
+    {
+        normal += normals[*itr];
+    }
+    normal.normalize();
+    
+    return normal;
+}
+
+osg::Vec3 Model::computeNormal(const Element& element) const
+{
+    osg::Vec3 normal;
+    for(unsigned int i=0;i<element.vertexIndices.size()-2;++i)
+    {
+        osg::Vec3 a = vertices[element.vertexIndices[i]];
+        osg::Vec3 b = vertices[element.vertexIndices[i+1]];
+        osg::Vec3 c = vertices[element.vertexIndices[i+2]];
+        osg::Vec3 localNormal = (b-a)   ^(c-b);
+        normal += localNormal;
+    }
+    normal.normalize();
+    
+    return normal;
+}
+
+bool Model::needReverse(const Element& element) const
+{
+    if (element.normalIndices.empty()) return true;
+    
+    return computeNormal(element)*averageNormal(element) < 0.0f;
+}
