<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<tt>I believe that the vtkOBJReader class never reads vertex normals from
an input file, due to a bug in vtkOBJReader.cxx at lines 208-209:</tt>
<p><tt>&nbsp;&nbsp;&nbsp; 208&nbsp;&nbsp; blank = (char *) strchr (line,
(int) ' ');</tt>
<br><tt>&nbsp;&nbsp;&nbsp; 209&nbsp;&nbsp; slash = (char *) strchr (line,
(int) '/');</tt>
<br><tt>&nbsp;&nbsp;&nbsp; 210&nbsp;&nbsp; if (blank &amp;&amp; slash &amp;&amp;
(slash &lt; blank))</tt>
<br><tt>&nbsp;&nbsp;&nbsp; 211&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</tt>
<p><tt>This code is in the middle of parsing a vertex/texture/normal string
for the next&nbsp; index into the array of normals. Because the current
code parses from the beginning of the 'line' variable, the resulting 'blank'
value is always less than the 'slash' value and, as a result, the subsequent
if statement (line 210) always evaluates to false. Instead, the parsing
should be done with respect to the current pointer position, i.e., the
correct code is:</tt>
<p><tt>&nbsp;&nbsp;&nbsp; 208&nbsp;&nbsp; blank = (char *) strchr (ptr,
(int) ' ');</tt>
<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
^^^</tt>
<br><tt>&nbsp;&nbsp;&nbsp; 209&nbsp;&nbsp; slash = (char *) strchr (ptr,
(int) '/');</tt>
<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
^^^</tt>
<p><tt>I found this out when using the vtkOBJReader class in a C program,
but I believe you can see it in the tclOBJReader.tcl example. I don't know
much about tcl, but at line 75 (before starting the interactor) I added:</tt>
<p><tt>&nbsp;&nbsp; set n [[[wavefront GetOutput] GetPoints] GetNumberOfPoints]</tt>
<br><tt>&nbsp;&nbsp; vtkNormals normals</tt>
<br><tt>&nbsp;&nbsp; set normals [[[wavefront GetOutput] GetPointData]
GetNormals]</tt>
<br><tt>&nbsp;&nbsp; set m [normals GetNumberOfNormals]</tt>
<br><tt>&nbsp;&nbsp; message .msg -text "There are $n points and $m normals"</tt>
<br><tt>&nbsp;&nbsp; pack&nbsp;&nbsp;&nbsp; .msg</tt>
<p><tt>and commented out line 81 (wm withdraw .) When I ran this on my
PC, the message window displays "There are 12330 points and 0 normals",
even though there are 4000 or so vertex normals in the cow.obj file.</tt>
<br><tt></tt>&nbsp;
<br><tt></tt>&nbsp;</html>