Home
JAQForum Ver 24.01
Log In or Join  
Active Topics
Local Time 08:59 01 Aug 2025 Privacy Policy
Jump to

Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.

Forum Index : Microcontroller and PC projects : CMM2 3D File Loader(s)

Author Message
PeteCotton

Guru

Joined: 13/08/2020
Location: Canada
Posts: 543
Posted: 11:42pm 04 Dec 2020
Copy link to clipboard 
Print this post

I thought I'd start a seperate thread where we can put any code for loading (or saving??) existing 3D file formats in to the new 3D engine. That way we won't be cluttering up the main thread.

This .WRL one (code to convert .wrl files in to the new 3D objects) is definitely a work in progress. But I thought I'd share the latest update. I've rewritten it so that it now has a bunch of custom string handling functions that I think will be useful for all other file loaders (I'm starting to write a .obj one as well).

I had to use "long strings" for the file load section (because of the 255 char limit on strings) and then I split it down in to smaller strings that I can parse.

This code doesn't work with some of the larger .WRL files as I realised halfway through the project that there's a whole pile of different ways to store data, including having multiple objects in the one file. So when you upload a truck it might have seperate hood, wheels etc, all at different relative locations. That's the next task to solve.


option explicit
option default float
dim integer camera_y = 0
dim integer viewplane = 700
dim integer camera_z = 0
dim integer camera_x = 0
dim integer c,t,s
timer=0
dim q(4)
dim yaw=rad(1),pitch=rad(2),roll=rad(0.5)
' Use GetWRLInfo to find out how many faces the model has
'GetWRLInfo("EliteShips\coriolis.wrl")

' This object has 14 faces, so put random colours on them
dim integer bcol(13)
for t=0 to 13
 bcol(t)=rgb(rnd*255,100+rnd*155, rnd*255)
next t
dim integer faceCol(13)
for t=0 to 13
 facecol(t)=t
next t

LoadWRL(1,"EliteShips\coriolis.wrl", bcol(), faceCol(), faceCol())

draw3d camera 1,viewplane,camera_x,camera_y,camera_z
page write 1

for c=0 to 7200
draw3d show 1,0,0,2000, 1
math q_euler yaw,pitch,roll,q()
draw3d rotate q(),1   ' rotate this object #
inc yaw,rad(1)
inc pitch,rad(2)
inc roll,rad(0.5)
page copy 1 to 0,b
next
page write 0
print 720000/timer
draw3d close all
end

sub GetWRLInfo(filename as string)
 local integer dummyArray(1)
 LoadWRL(-1, filename, dummyArray(), dummyArray(), dummyArray())
end sub

sub LoadWRL(objNum as integer, filename as string, bcol%(), edgeCol%(), faceCol%())
 local integer vertLS(10000), faceLS(10000)   ' Long strings
 local integer vertLSCursor, faceLSCursor
 local string dataLine$, a$
 local integer readingVertices=0
 local integer readingFaces=0
 local integer t,j,faceCount,vertCount, index1
 ' Get the data out of the file and in to vert$ and face$
 open filename for input as #1
 do  while not eof(1)
   line input #1,a$
   a$=Trim$(a$) ' Get rid of any leading or trailing spaces
   ' strip all formatting out of input line
   dataLine$=""
   for t=1 to len(a$)
     if asc(mid$(a$,t,1))>=32 then dataLine$=dataLine$ + mid$(a$,t,1)
   next t
   if left$(dataLine$,10)="coordIndex" then readingVertices=0:readingFaces=1
   if left$(dataLine$,16) = "coord Coordinate" then readingVertices=1:readingFaces=0
   if left$(dataLine$,1)="-" or (asc(left$(dataLine$,1))>47 and asc(left$(dataLine$,1))<58) then
     ' This line starts with a number
     if readingVertices=1 then
       if vertLSCursor+len(dataLine$)>=80000 then page write 0:?"String to large for vertices":end
       longstring append vertLS(), dataLine$
       inc vertLSCursor, len(dataLine$)
     end if
     if readingFaces=1 then
       if faceLSCursor+len(dataLine$)>=80000 then page write 0:?"String to large for faces":end
       longstring append faceLS(), dataLine$
       inc faceLSCursor, len(dataLine$)
     end if
   endif
   if instr(dataLine$,"]")<>0 then readingVertices=0:readingFaces=0
 loop
 close #1

 'vert$ is 3 points seperated by spaces. Each 3 points are then seperated by a comma
 'e.g. 160 0 160,0 160 160,...
 ' count the nuber of verts
 vertCount=CountDataPointsLS(vertLS(), vertLSCursor,",")

 ' face$ uses 4 or 5 numbers seperated by commas. -1 is used as the terminator
 ' Count the number of -1's to give us the face count
 faceCount=CountDataPointsLS(faceLS(), faceLSCursor, "-1")

 'load the face$ and vert$ data in to these arrays to populate our 3D object
 local float v(2,vertCount-1)    ' Vertice data
 local integer fc(faceCount-1)   ' count of points on each face

 ' load vertices from vert$
 ' These are in the form 160 0 160, 0 160 160,
 ' So first off split them up by commas to get each x,y,z point and load this in to vertData$()
 local string vertData$(vertCount-1)
 SplitLS(vertLS(), vertLSCursor, ",", vertData$())

 ' Now work through each point and split the string "160 0 160" up by spaces and load in to v(,)
 local string singleVertPoint$(3)
 for t=0 to vertCount-1
   Split(vertData$(t)," ", singleVertPoint$())
   v(0,t)=val(singleVertPoint$(0))
   v(1,t)=val(singleVertPoint$(1))
   v(2,t)=val(singleVertPoint$(2))
 next t

 ' face$ is in the form of 0, 1, 2,  3, -1, 0, 1, 5, -1, 0..
 ' where -1 denotes the end of that face data
 ' Split face$ up by "-1" to get an array of faceData$()
 local string faceData$(faceCount-1)

 SplitLS(faceLS(), faceLSCursor,"-1",faceData$())
 ' Now work through the array of faceData$() and count how many points we have for each face
 ' these are stored in fc()
 for t=0 to faceCount-1
   fc(t)=CountDataPoints(faceData(t),",")
 next t


 ' finally calculate the faces array fv()
 local integer fv(math(sum fc())-1)
 index1=0  ' position in array fv()
 local string tempArray(20)  ' assume a maxium of 20 points for any single face
 local integer count=0
 for t=0 to faceCount-1
   count=CountDataPoints(faceData(t),",")
   Split(faceData(t),",", tempArray())
   for j=0 to count-1
     fv(index1)=val(tempArray(j))
     index1=index1+1
   next j
 next t

 ' Is this a request for info from the developer
 if objNum=-1 then
   page write 0
   print "File: ", filename$
   print "Face Count: ", faceCount
   print "Vertice Count:", vertCount
   end
 end if
 draw3d create objNum, vertCount, faceCount, 1, v(), fc(), fv(),bcol%(),edgeCol%(),faceCol%()
end sub

'
' =================STRING HELPER FUNCTIONS ======================
'
function LTrim$(a$)
 LTrim$=a$
 do while instr(" ", left$(LTrim$,1))
   LTrim$=Mid$(Ltrim$,2)
 loop
end function

function RTrim$(a$)
 RTrim$=a$
 do while instr(" ", right$(RTrim$,1))
   RTrim$=Mid$(Rtrim$,1,len(RTrim$)-1)
 loop
end function

function Trim$(a$)
 Trim$=RTrim$(LTrim$(a$))
end function

' In order to size our arrays properly for the Split function (below) we need to know how
' many data points to expect. The CountDataPoints takes in a tring source$ and the character(s)
' which will be used to split it up, and this function willreturn a count of the data points
' that would be returned by Split. Note, only data points with actual data are counted, this makes
' splitting large strings up much easier. So for example ",4,5,6," and "4,5,6" split on comma will
' both return the number 3 - as there are onyl 3 value between the commas.
function CountDataPoints(source$, splitChar$)
 CountDataPoints=0
 local string nextDataPoint=""  
 for t=1 to len(source$)-len(splitChar$)
   if mid$(source$,t,len(splitChar$))=splitChar$ then  ' we have found a split point
     if trim$(nextDataPoint)<>"" then CountDataPoints = CountDataPoints + 1:nextDataPoint=""
     t=t+len(splitChar$)-1 ' if we are using a 2 (or more) char splitChar$, then skip the extra characters
   else
     nextDataPoint=nextDataPoint+mid$(source$,t,1)
   end if    
 next t
 if trim$(nextDataPoint)<>"" then CountDataPoints=CountDataPoints+1 ' Catch last data point if it is there
end function

' The Split function take in any string (source$) and breaks it down in to an array of smaller strings
' split upon the sub string (char$). These smaller strings are returned in array returnData$()
' Note: You need to know how many to expect so that you can size ReturnData$() appropriately. That
' is why we have te CountDataPoints function (above).
' The split is quite resiliant, and will only return strings that return actual data. Therefore the
' following strings ",1,2,3," and "1,2,3" and "  1,2 , 3," all return three elements (1,2,3).
' The split char can be more than one character, so we could split "0,1,2,3,-1,0,1,5,-1,0,3,4,-1"
' on -1 and yo would get three strings of "0,1,2,3," and ",0,1,5," and ",0,3,4,"
sub Split(source$, char$, returnData$())
 local string nextSplit=""
 local integer index=0
 for t=1 to len(source$)-len(char$)+1
   if mid$(source$,t,len(char$))=char$ then
     if trim$(nextSplit)<>"" then
       returnData$(index)=nextSplit
       nextSplit=""
       index=index+1
     endif
     t=t+len(char$)-1 ' if we are searching for a 2 char string, then skip over it
   else
     nextSplit=nextSplit+mid$(source$,t,1)
   end if    
 next t
 if trim$(nextSplit)<>"" then ' make sure we catch the last split string
   returnData$(index)=nextSplit
 endif
end sub

' LongString version of CountDataPoints where source$ is a long string
function CountDataPointsLS(source() as integer, sourceLength%, splitChar$)
 CountDataPointsLS=0
 local string nextDataPoint=""
 local integer tempLS(len(splitChar$))
 local integer nextCharLS(1)

 for t=1 to sourceLength%-len(splitChar$)
   longstring mid tempLS(), source(),t,len(splitChar$)
   if lgetstr$(tempLS(),1,len(splitChar$))=splitChar$ then  ' we have found a split point
     if trim$(nextDataPoint)<>"" then CountDataPointsLS = CountDataPointsLS + 1:nextDataPoint=""
     t=t+len(splitChar$)-1 ' if we are using a 2 (or more) char splitChar$, then skip the extra characters
   else
     longstring mid nextCharLS(), source(), t,1
     nextDataPoint=nextDataPoint+lgetstr$(nextCharLS(),1,1)
   end if    
 next t
 if trim$(nextDataPoint)<>"" then CountDataPointsLS=CountDataPointsLS+1 ' Catch last data point if it is there
end function

' LongString version of Split, where source$ is now a longstring
sub SplitLS(source() as integer, sourceLength%, splitChar$, returnData$())
 local string nextSplit=""
 local integer index=0
 local integer tempLS(len(splitChar$))
 local integer nextCharLS(1)

 for t=1 to sourceLength%-len(splitChar$)+1
   longstring mid tempLS(), source(),t,len(splitChar$)
   if lgetstr$(tempLS(),1,len(splitChar$))=splitChar$ then  ' we have found a split point
     if trim$(nextSplit)<>"" then
       returnData$(index)=nextSplit
       nextSplit=""
       index=index+1
     endif
     t=t+len(splitChar$)-1 ' if we are searching for a 2 char string, then skip over it
   else
     longstring mid nextCharLS(), source(), t,1
     nextSplit=nextSplit+lgetstr$(nextCharLS(),1,1)
   end if    
 next t
 if trim$(nextSplit)<>"" then ' make sure we catch the last split string
   returnData$(index)=nextSplit
 endif
end sub

Edited 2020-12-05 09:43 by PeteCotton
 
PeteCotton

Guru

Joined: 13/08/2020
Location: Canada
Posts: 543
Posted: 09:18pm 09 Dec 2020
Copy link to clipboard 
Print this post

I have the .OBJ loader "working". I use Quotes because there still appears to be some issue with the objects, but that might just be the order in which the primitives, that make it up, are loaded. In the crate object below you can see that some of the struts are missing. I'm not sure why that is, I'll try and investigate this weekend. They do re-appear as they rotate to the front of the object.



It can handle quite large objects, however I have to pre-allocate the Long String arrays to handle the parsing in LoadOBJ(). I have defined these as 100,000 elements - which I believe translates in to a maximum string length of 800K. i.e. If the text to define either the vertexes or faces exceeds 800,000 characters you will need to increase this limit.

The .OBJ file format is much easier to work with than .WRL. By default all faces are right hand/clockwise orientation.

It is clearly defined here.

http://paulbourke.net/dataformats/obj/

Currently I'm just throwing random colours at each face. But the .OBJ file format does contain definition for colours and/or textures, so I want to get that working.


option explicit
option default float
dim integer camera_y = 0
dim integer viewplane = 700
dim integer camera_z = 0
dim integer camera_x = 0
dim integer finalObject=1
dim integer c,t,s
timer=0
dim q(4)
dim yaw=rad(1),pitch=rad(2),roll=rad(0.5)

' Generate 50 random colours to use on faces
dim integer bcol(50)
for t=0 to 50
 bcol(t)=rgb(rnd()*255,rnd()*255, rnd()*255)
next t
' Works for putting random colours on objects with up to 500 faces
' Increase for objects wth more faces
dim integer faceCol(500)
for t=0 to 500
 facecol(t)=rnd()*50
next t

LoadOBJ(1,"EliteShips\wooden crate.obj", bcol(), faceCol(), faceCol())

draw3d camera 1,viewplane,camera_x,camera_y,camera_z
page write 1

for c=0 to 7200
 draw3d show 1,0,0,10, 0
 math q_euler yaw,pitch,roll,q()
 draw3d rotate q(),1   ' rotate this object #
 inc yaw,rad(0.1)
 inc pitch,rad(0.2)
 inc roll,rad(0.5)
 page copy 1 to 0,b
next
page write 0
print 720000/timer
draw3d close all
end

sub LoadOBJ(objNum%, filename$, bcol%(), edgeCol%(), faceCol%())
 local integer vertLS(100000), faceLS(100000)   ' Long strings
 local integer vertLSCursor%, faceLSCursor%
 local string dataLine$, a$
 ' Get the data out of the file and in to vert$ and face$
 open filename$ for input as #1
 do  while not eof(1)
   line input #1,a$
   a$=Trim$(a$) ' Get rid of any leading or trailing spaces
   ' strip all formatting out of input line
   dataLine$=""
   for t=1 to len(a$)
     if asc(mid$(a$,t,1))>=32 then dataLine$=dataLine$ + mid$(a$,t,1)
   next t
   
   ' Example vertice line "v -0.847 0.78 0.853"
   if left$(dataLine$,2)="v " then
     dataLine$=mid$(dataLine$,3)+","
     if vertLSCursor%+len(dataLine$)>=800000 then page write 0:?"String to large for vertices":end
     longstring append vertLS(), dataLine$
     inc vertLSCursor%, len(dataLine$)
   end if
   ' example face line "f 58/1/1/ 54/2/2 33/3/3 30/4/4" where values are v/vt/vn (vertext, texture, normal)
   if left$(dataLine$,2)="f " then
     dataLine$=mid$(dataLine$,3)+","
     if faceLSCursor%+len(dataLine$)>=800000 then page write 0:?"String to large for faces":end
     longstring append faceLS(), dataLine$
     inc faceLSCursor%, len(dataLine$)
   end if
 loop
 close #1

 Make3DObjectOBJ(objNum%, vertLS(), vertLSCursor%, faceLS(), faceLSCursor%, bcol%(), edgeCol%(), faceCol%())
end sub

sub Make3DObjectOBJ(objNum%, vertLS%(), vertLSCount%, faceLS%(), faceLSCount%, bcol%(), edgeCol%(), faceCol%())
 local integer t,j,faceCount,vertCount, index1

 'vert$ is 3 points seperated by spaces. Each 3 points are then seperated by a comma
 'e.g. 160 0 160,0 160 160,...
 ' count the nuber of verts
 vertCount=CountDataPointsLS(vertLS%(), vertLSCount%,",")

 ' face$ uses groups of 3 numbers seperated by /, these groups are
 ' in turn  seperated by spaces. Comma is used as the terminator
 ' Count the number of commas to give us the face count
 faceCount=CountDataPointsLS(faceLS%(), faceLSCount%, ",")

 'load the face$ and vert$ data in to these arrays to populate our 3D object
 local float v(2,vertCount-1)    ' Vertice data
 local integer fc(faceCount-1)   ' count of points on each face
 ' load vertices from vert$
 ' These are in the form 160 0 160, 0 160 160,
 ' So first off split them up by commas to get each x,y,z point and load this in to vertData$()
 local string vertData$(vertCount-1)
 SplitLS(vertLS%(), vertLSCount%, ",", vertData$())

 ' Now work through each point and split the string "160 0 160" up by spaces and load in to v(,)
 local string singleVertPoint$(3)
 for t=0 to vertCount-1
   Split(vertData$(t)," ", singleVertPoint$())
   v(0,t)=val(singleVertPoint$(0))
   v(1,t)=val(singleVertPoint$(1))
   v(2,t)=val(singleVertPoint$(2))
 next t

 ' face$ i in the form "58/1/1/ 54/2/2 33/3/3 30/4/4," where values are v/vt/vn (vertext, texture, normal)
 ' where comma denotes the end of that face data
 ' Split face$ up by "," to get an array of faceData$()
 local string faceData$(faceCount-1)

 SplitLS(faceLS%(), faceLSCount%,",",faceData$())
 ' Now work through the array of faceData$() and count how many points we have for each face
 ' these are stored in fc()
 for t=0 to faceCount-1
   fc(t)=CountDataPoints(faceData$(t)," ")
 next t

 ' finally calculate the faces array fv()
 local integer fv(math(sum fc())-1)
 index1=0  ' position in array fv()
 local string tempArray1$(20)  ' assume a maxium of 20 points for any single face
 local string tempArray2$(3)
 local integer count%=0

 for t=0 to faceCount-1
   count%=CountDataPoints(faceData$(t)," ")
   Split(faceData$(t)," ", tempArray1$())
   for j=0 to count%-1
     ' Now spit up "12/53/6" and use the first number (the vertex)
     Split(tempArray1$(j),"/",tempArray2$())
     fv(index1)=val(tempArray2$(0))-1
     index1=index1+1
   next j
 next t

 ' Is this a request for info from the developer
 if objNum%=-1 then
   page write 0
   print "Face Count: ", faceCount
   print "Vertice Count:", vertCount
   end
 end if
 draw3d create objNum%, vertCount, faceCount, 1, v(), fc(), fv(),bcol%(),edgeCol%(),faceCol%()
end sub




'
' =================STRING HELPER FUNCTIONS ======================
'
function LTrim$(a$)
 LTrim$=a$
 do while instr(" ", left$(LTrim$,1))
   LTrim$=Mid$(Ltrim$,2)
 loop
end function

function RTrim$(a$)
 RTrim$=a$
 do while instr(" ", right$(RTrim$,1))
   RTrim$=Mid$(Rtrim$,1,len(RTrim$)-1)
 loop
end function

function Trim$(a$)
 Trim$=RTrim$(LTrim$(a$))
end function

' In order to size our arrays properly for the Split function (below) we need to know how
' many data points to expect. The CountDataPoints takes in a tring source$ and the character(s)
' which will be used to split it up, and this function willreturn a count of the data points
' that would be returned by Split. Note, only data points with actual data are counted, this makes
' splitting large strings up much easier. So for example ",4,5,6," and "4,5,6" split on comma will
' both return the number 3 - as there are onyl 3 value between the commas.
function CountDataPoints(source$, splitChar$)
 CountDataPoints=0
 local string nextDataPoint=""  
 for t=1 to len(source$)-len(splitChar$)
   if mid$(source$,t,len(splitChar$))=splitChar$ then  ' we have found a split point
     if trim$(nextDataPoint)<>"" then CountDataPoints = CountDataPoints + 1:nextDataPoint=""
     t=t+len(splitChar$)-1 ' if we are using a 2 (or more) char splitChar$, then skip the extra characters
   else
     nextDataPoint=nextDataPoint+mid$(source$,t,1)
   end if    
 next t
 if trim$(nextDataPoint)<>"" then CountDataPoints=CountDataPoints+1 ' Catch last data point if it is there
end function

' The Split function take in any string (source$) and breaks it down in to an array of smaller strings
' split upon the sub string (char$). These smaller strings are returned in array returnData$()
' Note: You need to know how many to expect so that you can size ReturnData$() appropriately. That
' is why we have te CountDataPoints function (above).
' The split is quite resiliant, and will only return strings that return actual data. Therefore the
' following strings ",1,2,3," and "1,2,3" and "  1,2 , 3," all return three elements (1,2,3).
' The split char can be more than one character, so we could split "0,1,2,3,-1,0,1,5,-1,0,3,4,-1"
' on -1 and yo would get three strings of "0,1,2,3," and ",0,1,5," and ",0,3,4,"
sub Split(source$, char$, returnData$())
 local string nextSplit=""
 local integer index=0
 for t=1 to len(source$)-len(char$)+1
   if mid$(source$,t,len(char$))=char$ then
     if trim$(nextSplit)<>"" then
       returnData$(index)=nextSplit
       nextSplit=""
       index=index+1
     endif
     t=t+len(char$)-1 ' if we are searching for a 2 char string, then skip over it
   else
     nextSplit=nextSplit+mid$(source$,t,1)
   end if    
 next t
 if trim$(nextSplit)<>"" then ' make sure we catch the last split string
   returnData$(index)=nextSplit
 endif
end sub

' LongString version of CountDataPoints where source$ is a long string
function CountDataPointsLS(source() as integer, sourceLength%, splitChar$)
 CountDataPointsLS=0
 local string nextDataPoint=""
 local integer tempLS(len(splitChar$))
 local integer nextCharLS(1)

 for t=1 to sourceLength%-len(splitChar$)
   longstring mid tempLS(), source(),t,len(splitChar$)
   if lgetstr$(tempLS(),1,len(splitChar$))=splitChar$ then  ' we have found a split point
     if trim$(nextDataPoint)<>"" then CountDataPointsLS = CountDataPointsLS + 1:nextDataPoint=""
     t=t+len(splitChar$)-1 ' if we are using a 2 (or more) char splitChar$, then skip the extra characters
   else
     longstring mid nextCharLS(), source(), t,1
     nextDataPoint=nextDataPoint+lgetstr$(nextCharLS(),1,1)
   end if    
 next t
 if trim$(nextDataPoint)<>"" then CountDataPointsLS=CountDataPointsLS+1 ' Catch last data point if it is there
end function

' Lognstring version of Split, where source$ is now a longstring
sub SplitLS(source() as integer, sourceLength%, splitChar$, returnData$())
 local string nextSplit=""
 local integer index=0
 local integer tempLS(len(splitChar$))
 local integer nextCharLS(1)

 for t=1 to sourceLength%-len(splitChar$)+1
   longstring mid tempLS(), source(),t,len(splitChar$)
   if lgetstr$(tempLS(),1,len(splitChar$))=splitChar$ then  ' we have found a split point
     if trim$(nextSplit)<>"" then
       returnData$(index)=nextSplit
       nextSplit=""
       index=index+1
     endif
     t=t+len(splitChar$)-1 ' if we are searching for a 2 char string, then skip over it
   else
     longstring mid nextCharLS(), source(), t,1
     nextSplit=nextSplit+lgetstr$(nextCharLS(),1,1)
   end if    
 next t
 if trim$(nextSplit)<>"" then ' make sure we catch the last split string
   returnData$(index)=nextSplit
 endif
end sub




And the source .OBJ file is here


# Blender v2.90.0 OBJ File: 'wooden crate.blend'
# www.blender.org
mtllib wooden crate.mtl
o crate_Cube.004
v -0.847977 0.734659 0.853419
v -0.847977 -0.850017 -0.731258
v -0.847977 0.850017 0.738061
v -0.847977 -0.734659 -0.846616
v -0.847977 0.005373 0.124132
v -0.847977 -0.120731 -0.001971
v -0.847977 -0.005373 -0.117329
v -0.847977 0.120731 0.008774
v -0.847977 0.852453 -0.722949
v -0.847977 0.726350 -0.849052
v -0.847977 -0.852453 0.729751
v -0.847977 -0.726350 0.855855
v -0.985375 0.747635 0.840443
v -0.967024 0.734659 0.853419
v -0.982916 0.741147 0.846931
v -0.976199 0.736398 0.851680
v -0.967024 -0.850017 -0.731258
v -0.985375 -0.837042 -0.744234
v -0.976199 -0.848279 -0.732996
v -0.982916 -0.843530 -0.737746
v -0.967024 0.850017 0.738061
v -0.985375 0.837042 0.751036
v -0.976199 0.848279 0.739799
v -0.982916 0.843530 0.744548
v -0.985375 -0.747635 -0.833640
v -0.967024 -0.734659 -0.846616
v -0.982916 -0.741147 -0.840128
v -0.976199 -0.736398 -0.844878
v -0.967024 0.726350 -0.849052
v -0.985375 0.745322 -0.830080
v -0.976199 0.728892 -0.846510
v -0.982916 0.735836 -0.839566
v -0.985375 0.833482 -0.741920
v -0.967024 0.852453 -0.722949
v -0.982916 0.842968 -0.732434
v -0.976199 0.849912 -0.725490
v -0.967024 -0.726350 0.855855
v -0.985375 -0.745322 0.836883
v -0.976199 -0.728892 0.853313
v -0.982916 -0.735836 0.846369
v -0.985375 -0.833482 0.748723
v -0.967024 -0.852453 0.729751
v -0.982916 -0.842968 0.739237
v -0.976199 -0.849912 0.732293
v -0.967024 -0.120731 -0.001971
v -0.985375 -0.088783 0.004025
v -0.976199 -0.116451 -0.001168
v -0.982916 -0.104757 0.001027
v -0.967024 0.005373 0.124132
v -0.985375 -0.000623 0.092185
v -0.976199 0.004569 0.119852
v -0.982916 0.002375 0.108158
v -0.967024 0.120731 0.008774
v -0.985375 0.088783 0.002778
v -0.976199 0.116451 0.007971
v -0.982916 0.104757 0.005776
v -0.967024 -0.005373 -0.117329
v -0.985375 0.000623 -0.085382
v -0.976199 -0.004569 -0.113049
v -0.982916 -0.002375 -0.101356
v 0.777772 0.777772 -1.000000
v 1.000000 0.777772 -0.777772
v 0.969135 0.984547 -0.995877
v 0.984547 0.969135 -0.995877
v 0.983895 0.983895 -0.991871
v 0.984547 0.995877 -0.969135
v 0.969135 0.995877 -0.984547
v 0.983895 0.991871 -0.983895
v 0.995877 0.969135 -0.984547
v 0.995877 0.984547 -0.969135
v 0.991871 0.983895 -0.983895
v 0.777772 -1.000000 -0.777772
v 0.777772 -0.777772 -1.000000
v 1.000000 -0.777772 -0.777772
v 0.969135 -0.995877 -0.984547
v 0.984547 -0.995877 -0.969135
v 0.983895 -0.991871 -0.983895
v 0.984547 -0.969135 -0.995877
v 0.969135 -0.984547 -0.995877
v 0.983895 -0.983895 -0.991871
v 0.995877 -0.984547 -0.969135
v 0.995877 -0.969135 -0.984547
v 0.991871 -0.983895 -0.983895
v 1.000000 0.777772 0.777772
v 0.777772 0.777772 1.000000
v 0.995877 0.984547 0.969135
v 0.995877 0.969135 0.984547
v 0.991871 0.983895 0.983895
v 0.969135 0.995877 0.984547
v 0.984547 0.995877 0.969135
v 0.983895 0.991871 0.983895
v 0.984547 0.969135 0.995877
v 0.969135 0.984547 0.995877
v 0.983895 0.983895 0.991871
v 1.000000 -0.777772 0.777772
v 0.777772 -0.777772 1.000000
v 0.777772 -1.000000 0.777772
v 0.995877 -0.969135 0.984547
v 0.995877 -0.984547 0.969135
v 0.991871 -0.983895 0.983895
v 0.969135 -0.984547 0.995877
v 0.984547 -0.969135 0.995877
v 0.983895 -0.983895 0.991871
v 0.984547 -0.995877 0.969135
v 0.969135 -0.995877 0.984547
v 0.983895 -0.991871 0.983895
v -0.777772 0.777772 -1.000000
v -1.000000 0.777772 -0.777772
v -0.984547 0.969135 -0.995877
v -0.969135 0.984547 -0.995877
v -0.983895 0.983895 -0.991871
v -0.995877 0.984547 -0.969135
v -0.995877 0.969135 -0.984547
v -0.991871 0.983895 -0.983895
v -0.969135 0.995877 -0.984547
v -0.984547 0.995877 -0.969135
v -0.983895 0.991871 -0.983895
v -1.000000 -0.777772 -0.777772
v -0.777772 -0.777772 -1.000000
v -0.777772 -1.000000 -0.777772
v -0.995877 -0.969135 -0.984547
v -0.995877 -0.984547 -0.969135
v -0.991871 -0.983895 -0.983895
v -0.969135 -0.984547 -0.995877
v -0.984547 -0.969135 -0.995877
v -0.983895 -0.983895 -0.991871
v -0.984547 -0.995877 -0.969135
v -0.969135 -0.995877 -0.984547
v -0.983895 -0.991871 -0.983895
v -1.000000 0.777772 0.777772
v -0.777772 0.777772 1.000000
v -0.995877 0.969135 0.984547
v -0.995877 0.984547 0.969135
v -0.991871 0.983895 0.983895
v -0.969135 0.984547 0.995877
v -0.984547 0.969135 0.995877
v -0.983895 0.983895 0.991871
v -0.984547 0.995877 0.969135
v -0.969135 0.995877 0.984547
v -0.983895 0.991871 0.983895
v -0.777772 -1.000000 0.777772
v -0.777772 -0.777772 1.000000
v -1.000000 -0.777772 0.777772
v -0.969135 -0.995877 0.984547
v -0.984547 -0.995877 0.969135
v -0.983895 -0.991871 0.983895
v -0.984547 -0.969135 0.995877
v -0.969135 -0.984547 0.995877
v -0.983895 -0.983895 0.991871
v -0.995877 -0.984547 0.969135
v -0.995877 -0.969135 0.984547
v -0.991871 -0.983895 0.983895
v -0.969135 -1.000000 -0.969135
v -0.969135 -1.000000 0.969135
v -1.000000 -0.969135 0.969135
v -1.000000 -0.969135 -0.969135
v 0.969135 -1.000000 -0.969135
v -0.969135 -0.969135 -1.000000
v 0.969135 -0.969135 -1.000000
v 1.000000 0.969135 -0.969135
v 1.000000 -0.969135 -0.969135
v 0.969135 0.969135 -1.000000
v -0.969135 -0.969135 1.000000
v -0.969135 0.969135 1.000000
v -1.000000 0.969135 0.969135
v 0.969135 0.969135 1.000000
v 0.969135 -0.969135 1.000000
v 1.000000 -0.969135 0.969135
v 1.000000 0.969135 0.969135
v -0.969135 0.969135 -1.000000
v -1.000000 0.969135 -0.969135
v 0.969135 1.000000 0.969135
v -0.969135 1.000000 0.969135
v 0.969135 1.000000 -0.969135
v 0.969135 -1.000000 0.969135
v -0.969135 1.000000 -0.969135
v -0.777772 -0.860564 -0.777772
v -0.777772 -0.860564 0.777772
v -0.860564 -0.777772 0.777772
v -0.860564 -0.777772 -0.777772
v 0.777772 -0.860564 -0.777772
v -0.777772 -0.777772 -0.860564
v 0.777772 -0.777772 -0.860564
v 0.860564 0.777772 -0.777772
v 0.860564 -0.777772 -0.777772
v 0.777772 0.777772 -0.860564
v -0.777772 -0.777772 0.860564
v -0.777772 0.777772 0.860564
v -0.860564 0.777772 0.777772
v 0.777772 0.777772 0.860564
v 0.777772 -0.777772 0.860564
v 0.860564 -0.777772 0.777772
v 0.860564 0.777772 0.777772
v -0.777772 0.777772 -0.860564
v -0.860564 0.777772 -0.777772
v 0.777772 0.860564 0.777772
v -0.777772 0.860564 0.777772
v 0.777772 0.860564 -0.777772
v 0.777772 -0.860564 0.777772
v -0.777772 0.860564 -0.777772
v 0.830168 1.000000 -0.830168
v 0.777772 0.947605 -0.777772
v 0.830168 1.000000 0.830168
v 0.777772 0.947605 0.777772
v -0.777772 0.947605 -0.777772
v -0.830168 1.000000 -0.830168
v -0.777772 0.947605 0.777772
v -0.830168 1.000000 0.830168
v 0.850017 0.734659 0.851379
v -0.734659 -0.850017 0.851379
v 0.734659 0.850017 0.851379
v -0.850017 -0.734659 0.851379
v 0.120731 0.005373 0.851379
v -0.005373 -0.120731 0.851379
v -0.120731 -0.005373 0.851379
v 0.005373 0.120731 0.851379
v -0.726350 0.852453 0.851379
v -0.852453 0.726350 0.851379
v 0.726350 -0.852453 0.851379
v 0.852453 -0.726350 0.851379
v 0.837042 0.747635 0.988776
v 0.850017 0.734659 0.970425
v 0.843530 0.741147 0.986317
v 0.848279 0.736398 0.979601
v -0.734659 -0.850017 0.970425
v -0.747635 -0.837042 0.988776
v -0.736398 -0.848279 0.979601
v -0.741147 -0.843530 0.986317
v 0.734659 0.850017 0.970425
v 0.747635 0.837042 0.988776
v 0.736398 0.848279 0.979601
v 0.741147 0.843530 0.986317
v -0.837042 -0.747635 0.988776
v -0.850017 -0.734659 0.970425
v -0.843530 -0.741147 0.986317
v -0.848279 -0.736398 0.979601
v -0.852453 0.726350 0.970425
v -0.833482 0.745322 0.988776
v -0.849912 0.728892 0.979601
v -0.842968 0.735836 0.986317
v -0.745322 0.833482 0.988776
v -0.726350 0.852453 0.970425
v -0.735836 0.842968 0.986317
v -0.728892 0.849912 0.979601
v 0.852453 -0.726350 0.970425
v 0.833482 -0.745322 0.988776
v 0.849912 -0.728892 0.979601
v 0.842968 -0.735836 0.986317
v 0.745322 -0.833482 0.988776
v 0.726350 -0.852453 0.970425
v 0.735836 -0.842968 0.986317
v 0.728892 -0.849912 0.979601
v -0.005373 -0.120731 0.970425
v 0.000623 -0.088783 0.988776
v -0.004569 -0.116451 0.979601
v -0.002375 -0.104757 0.986317
v 0.120731 0.005373 0.970425
v 0.088783 -0.000623 0.988776
v 0.116451 0.004569 0.979601
v 0.104757 0.002375 0.986317
v 0.005373 0.120731 0.970425
v -0.000623 0.088783 0.988776
v 0.004569 0.116451 0.979601
v 0.002375 0.104757 0.986317
v -0.120731 -0.005373 0.970425
v -0.088783 0.000623 0.988776
v -0.116451 -0.004569 0.979601
v -0.104757 -0.002375 0.986317
v -0.850017 0.734659 -0.844576
v 0.734659 -0.850017 -0.844576
v -0.734659 0.850017 -0.844576
v 0.850017 -0.734659 -0.844576
v -0.120731 0.005373 -0.844576
v 0.005373 -0.120731 -0.844576
v 0.120731 -0.005373 -0.844576
v -0.005373 0.120731 -0.844576
v 0.726350 0.852453 -0.844576
v 0.852453 0.726350 -0.844576
v -0.726350 -0.852453 -0.844576
v -0.852453 -0.726350 -0.844576
v -0.837042 0.747635 -0.981973
v -0.850017 0.734659 -0.963623
v -0.843530 0.741147 -0.979515
v -0.848279 0.736398 -0.972798
v 0.734659 -0.850017 -0.963623
v 0.747635 -0.837042 -0.981973
v 0.736398 -0.848279 -0.972798
v 0.741147 -0.843530 -0.979515
v -0.734659 0.850017 -0.963623
v -0.747635 0.837042 -0.981973
v -0.736398 0.848279 -0.972798
v -0.741147 0.843530 -0.979515
v 0.837042 -0.747635 -0.981973
v 0.850017 -0.734659 -0.963623
v 0.843529 -0.741147 -0.979515
v 0.848279 -0.736398 -0.972798
v 0.852453 0.726350 -0.963623
v 0.833482 0.745322 -0.981973
v 0.849912 0.728892 -0.972798
v 0.842967 0.735836 -0.979515
v 0.745322 0.833482 -0.981973
v 0.726350 0.852453 -0.963623
v 0.735836 0.842968 -0.979515
v 0.728892 0.849912 -0.972798
v -0.852453 -0.726350 -0.963623
v -0.833482 -0.745322 -0.981973
v -0.849912 -0.728892 -0.972798
v -0.842968 -0.735836 -0.979515
v -0.745322 -0.833482 -0.981973
v -0.726350 -0.852453 -0.963623
v -0.735836 -0.842968 -0.979515
v -0.728892 -0.849912 -0.972798
v 0.005373 -0.120731 -0.963623
v -0.000623 -0.088783 -0.981973
v 0.004569 -0.116451 -0.972798
v 0.002375 -0.104757 -0.979515
v -0.120731 0.005373 -0.963623
v -0.088783 -0.000623 -0.981973
v -0.116451 0.004569 -0.972798
v -0.104757 0.002375 -0.979515
v -0.005373 0.120731 -0.963623
v 0.000623 0.088783 -0.981973
v -0.004569 0.116451 -0.972798
v -0.002375 0.104757 -0.979515
v 0.120731 -0.005373 -0.963623
v 0.088783 0.000623 -0.981973
v 0.116451 -0.004569 -0.972798
v 0.104757 -0.002375 -0.979515
v 0.847977 0.734659 -0.846616
v 0.847978 -0.850017 0.738061
v 0.847977 0.850017 -0.731258
v 0.847978 -0.734659 0.853419
v 0.847977 0.005373 -0.117329
v 0.847977 -0.120731 0.008774
v 0.847977 -0.005373 0.124132
v 0.847977 0.120731 -0.001971
v 0.847978 0.852453 0.729751
v 0.847978 0.726350 0.855855
v 0.847977 -0.852453 -0.722949
v 0.847977 -0.726350 -0.849052
v 0.985375 0.747635 -0.833640
v 0.967024 0.734659 -0.846616
v 0.982916 0.741147 -0.840128
v 0.976199 0.736398 -0.844878
v 0.967024 -0.850017 0.738061
v 0.985375 -0.837042 0.751036
v 0.976199 -0.848279 0.739799
v 0.982916 -0.843530 0.744548
v 0.967024 0.850017 -0.731258
v 0.985375 0.837042 -0.744234
v 0.976199 0.848279 -0.732996
v 0.982916 0.843530 -0.737746
v 0.985375 -0.747635 0.840443
v 0.967024 -0.734659 0.853419
v 0.982916 -0.741147 0.846931
v 0.976199 -0.736398 0.851680
v 0.967024 0.726350 0.855855
v 0.985375 0.745322 0.836883
v 0.976199 0.728892 0.853313
v 0.982916 0.735836 0.846369
v 0.985375 0.833482 0.748723
v 0.967024 0.852453 0.729751
v 0.982916 0.842968 0.739237
v 0.976199 0.849912 0.732293
v 0.967024 -0.726350 -0.849052
v 0.985375 -0.745322 -0.830080
v 0.976199 -0.728892 -0.846510
v 0.982916 -0.735836 -0.839566
v 0.985375 -0.833482 -0.741920
v 0.967024 -0.852453 -0.722949
v 0.982916 -0.842968 -0.732435
v 0.976199 -0.849912 -0.725490
v 0.967024 -0.120731 0.008774
v 0.985375 -0.088783 0.002778
v 0.976199 -0.116451 0.007971
v 0.982916 -0.104757 0.005776
v 0.967024 0.005373 -0.117329
v 0.985375 -0.000623 -0.085382
v 0.976199 0.004569 -0.113049
v 0.982916 0.002375 -0.101356
v 0.967024 0.120731 -0.001971
v 0.985375 0.088783 0.004025
v 0.976199 0.116451 -0.001168
v 0.982916 0.104757 0.001027
v 0.967024 -0.005373 0.124132
v 0.985375 0.000623 0.092185
v 0.976199 -0.004569 0.119852
v 0.982916 -0.002375 0.108158
vt 0.833223 0.865227
vt 0.844621 0.853837
vt 0.939705 0.948983
vt 0.928307 0.960373
vt 0.613492 0.083074
vt 0.613541 0.204766
vt 0.599495 0.204772
vt 0.599445 0.083080
vt 0.833070 0.842279
vt 0.928154 0.747257
vt 0.939705 0.758815
vt 0.676892 0.444810
vt 0.676892 0.322771
vt 0.690978 0.322771
vt 0.690978 0.444810
vt 0.132582 0.452615
vt 0.118535 0.452621
vt 0.118486 0.330929
vt 0.132532 0.330923
vt 0.196224 0.085336
vt 0.210637 0.085336
vt 0.210637 0.210625
vt 0.196224 0.210625
vt 0.821672 0.853669
vt 0.726589 0.758523
vt 0.737986 0.747133
vt 0.726589 0.948691
vt 0.738140 0.960249
vt 0.167092 0.210398
vt 0.152696 0.210398
vt 0.152696 0.085258
vt 0.167092 0.085258
vt 0.189017 0.210568
vt 0.174620 0.210568
vt 0.174620 0.085429
vt 0.189017 0.085429
vt 0.833166 0.083843
vt 0.847579 0.083843
vt 0.847579 0.209132
vt 0.833166 0.209132
vt 0.168010 0.213851
vt 0.168028 0.085461
vt 0.170243 0.085453
vt 0.170231 0.212356
vt 0.172436 0.085442
vt 0.172432 0.211114
vt 0.146085 0.213680
vt 0.146103 0.085290
vt 0.148318 0.085282
vt 0.148307 0.212186
vt 0.150512 0.085271
vt 0.150507 0.210944
vt 0.139020 0.324777
vt 0.139020 0.452573
vt 0.136843 0.452587
vt 0.136818 0.327887
vt 0.134706 0.452601
vt 0.134662 0.330116
vt 0.627383 0.080140
vt 0.627383 0.202178
vt 0.625253 0.202161
vt 0.625253 0.079701
vt 0.623116 0.202143
vt 0.623116 0.078527
vt 0.620958 0.202125
vt 0.620958 0.076928
vt 0.615622 0.082267
vt 0.615665 0.204752
vt 0.617777 0.080038
vt 0.617803 0.204738
vt 0.619979 0.076928
vt 0.619979 0.204723
vt 0.674762 0.444793
vt 0.674762 0.322333
vt 0.672625 0.444775
vt 0.672624 0.321159
vt 0.670467 0.444757
vt 0.670467 0.319561
vt 0.189639 0.210585
vt 0.189639 0.083082
vt 0.191845 0.084201
vt 0.191845 0.210595
vt 0.194037 0.085025
vt 0.194037 0.210608
vt 0.830979 0.209114
vt 0.830979 0.083532
vt 0.828787 0.209101
vt 0.828787 0.082707
vt 0.826581 0.209092
vt 0.826581 0.081588
vt 0.641469 0.080140
vt 0.641469 0.202178
vt 0.705452 0.485803
vt 0.705508 0.294512
vt 0.721616 0.278452
vt 0.721512 0.501911
vt 0.744483 0.510744
vt 0.944106 0.510744
vt 0.944106 0.528638
vt 0.744483 0.528638
vt 0.266133 0.512454
vt 0.465756 0.512454
vt 0.465756 0.530348
vt 0.266133 0.530348
vt 0.961999 0.528638
vt 0.961999 0.728261
vt 0.944106 0.728261
vt 0.756434 0.262151
vt 0.756090 0.266389
vt 0.751900 0.266003
vt 0.752366 0.262050
vt 0.497532 0.270494
vt 0.497992 0.274446
vt 0.494273 0.274526
vt 0.493655 0.271718
vt 0.498158 0.278348
vt 0.494279 0.278249
vt 0.490199 0.277767
vt 0.491497 0.273878
vt 0.744275 0.262179
vt 0.748327 0.262051
vt 0.748807 0.266043
vt 0.744610 0.266405
vt 0.011101 0.278513
vt 0.007141 0.278411
vt 0.007135 0.274610
vt 0.010932 0.274529
vt 0.002976 0.277919
vt 0.004301 0.273949
vt 0.756633 0.030316
vt 0.752574 0.030461
vt 0.752074 0.026471
vt 0.756266 0.026085
vt 0.748535 0.030476
vt 0.748982 0.026524
vt 0.744474 0.030391
vt 0.744788 0.026160
vt 0.010462 0.270494
vt 0.006504 0.271743
vt 0.508189 0.261781
vt 0.507871 0.266012
vt 0.503675 0.265644
vt 0.504128 0.261692
vt 0.490199 0.502432
vt 0.494152 0.501972
vt 0.494231 0.505691
vt 0.491423 0.506309
vt 0.498053 0.501806
vt 0.497954 0.505686
vt 0.497472 0.509765
vt 0.493584 0.508467
vt 0.496042 0.261831
vt 0.500093 0.261699
vt 0.500580 0.265691
vt 0.496380 0.266059
vt 0.508382 0.030083
vt 0.504330 0.030215
vt 0.503843 0.026223
vt 0.508043 0.025855
vt 0.500295 0.030222
vt 0.500749 0.026270
vt 0.496235 0.030134
vt 0.496553 0.025902
vt 0.247261 0.277980
vt 0.243225 0.278450
vt 0.243144 0.274653
vt 0.246011 0.274022
vt 0.239242 0.278619
vt 0.239343 0.274659
vt 0.239835 0.270494
vt 0.243805 0.271819
vt 0.993548 0.265355
vt 0.997725 0.265460
vt 0.997681 0.269504
vt 0.993636 0.269515
vt 0.002976 0.262878
vt 0.007113 0.262654
vt 0.006903 0.266628
vt 0.003898 0.266882
vt 0.011229 0.262624
vt 0.011032 0.266824
vt 0.729470 0.277827
vt 0.725518 0.278287
vt 0.725438 0.274567
vt 0.728246 0.273950
vt 0.721715 0.274573
vt 0.722197 0.270494
vt 0.726086 0.271792
vt 0.011781 0.027827
vt 0.007689 0.027834
vt 0.007443 0.023856
vt 0.011560 0.023646
vt 0.003515 0.027610
vt 0.004443 0.023634
vt 0.993565 0.027491
vt 0.993617 0.023319
vt 0.997658 0.023308
vt 0.997725 0.027350
vt 0.002976 0.507292
vt 0.007011 0.506822
vt 0.007092 0.510620
vt 0.004225 0.511250
vt 0.010995 0.506653
vt 0.010893 0.510614
vt 0.010401 0.514779
vt 0.006431 0.513454
vt 0.247800 0.261559
vt 0.251855 0.261421
vt 0.252348 0.265414
vt 0.248151 0.265789
vt 0.255892 0.261412
vt 0.255442 0.265363
vt 0.259953 0.261498
vt 0.259637 0.265730
vt 0.722137 0.509765
vt 0.721677 0.505812
vt 0.725397 0.505733
vt 0.726014 0.508541
vt 0.725391 0.502010
vt 0.729470 0.502492
vt 0.728172 0.506380
vt 0.239135 0.506760
vt 0.243096 0.506861
vt 0.243102 0.510662
vt 0.239304 0.510743
vt 0.247261 0.507353
vt 0.245936 0.511323
vt 0.260155 0.029757
vt 0.256103 0.029887
vt 0.255620 0.025896
vt 0.259818 0.025530
vt 0.252067 0.029890
vt 0.252527 0.025940
vt 0.248004 0.029795
vt 0.248337 0.025564
vt 0.239774 0.514779
vt 0.243732 0.513529
vt 0.490199 0.964650
vt 0.490199 0.765027
vt 0.508093 0.765027
vt 0.508093 0.964650
vt 0.033626 0.484078
vt 0.216560 0.484128
vt 0.224848 0.052796
vt 0.035041 0.051391
vt 0.033677 0.301145
vt 0.970002 0.051301
vt 0.779729 0.053343
vt 0.721186 0.238894
vt 0.721325 0.053562
vt 0.779615 0.239231
vt 0.283240 0.053037
vt 0.283099 0.238332
vt 0.224714 0.238390
vt 0.472959 0.238556
vt 0.473092 0.053293
vt 0.531464 0.053356
vt 0.531332 0.238623
vt 0.969999 0.241497
vt 0.034624 0.239152
vt 0.468542 0.501966
vt 0.268918 0.501966
vt 0.268918 0.490796
vt 0.468542 0.490796
vt 0.268918 0.280003
vt 0.468541 0.280003
vt 0.468541 0.291173
vt 0.268918 0.291173
vt 0.216610 0.301195
vt 0.479711 0.291173
vt 0.479712 0.490796
vt 0.514161 0.485747
vt 0.707716 0.728261
vt 0.508093 0.728261
vt 0.508093 0.528638
vt 0.707716 0.528638
vt 0.744483 0.728261
vt 0.020870 0.733274
vt 0.020870 0.533651
vt 0.220493 0.533651
vt 0.220493 0.733274
vt 0.465756 0.729971
vt 0.266133 0.729971
vt 0.707716 0.765027
vt 0.707716 0.964650
vt 0.707716 0.982544
vt 0.508093 0.982544
vt 0.514217 0.294456
vt 0.020870 0.515757
vt 0.220493 0.515757
vt 0.238387 0.533651
vt 0.238387 0.733274
vt 0.725610 0.765027
vt 0.725610 0.964650
vt 0.726589 0.728261
vt 0.726589 0.528638
vt 0.490199 0.728261
vt 0.490199 0.528638
vt 0.725610 0.528638
vt 0.725610 0.728261
vt 0.483650 0.530348
vt 0.483650 0.729971
vt 0.002976 0.733274
vt 0.002976 0.533651
vt 0.248239 0.729971
vt 0.248239 0.530348
vt 0.944106 0.746154
vt 0.744483 0.746154
vt 0.508093 0.510744
vt 0.707716 0.510744
vt 0.465756 0.747865
vt 0.266133 0.747864
vt 0.707716 0.746154
vt 0.508093 0.746154
vt 0.220493 0.751168
vt 0.020870 0.751168
vt 0.508093 0.747133
vt 0.707716 0.747133
vt 0.475265 0.511475
vt 0.262195 0.511475
vt 0.257748 0.291173
vt 0.257748 0.490796
vt 0.248239 0.497520
vt 0.248239 0.284449
vt 0.489220 0.284449
vt 0.489220 0.497520
vt 0.262194 0.270494
vt 0.475265 0.270494
vt 0.837084 0.388588
vt 0.848481 0.377198
vt 0.943565 0.472343
vt 0.932168 0.483733
vt 0.663000 0.325707
vt 0.663050 0.447400
vt 0.649004 0.447405
vt 0.648954 0.325713
vt 0.836930 0.365639
vt 0.932014 0.270617
vt 0.943565 0.282175
vt 0.648873 0.202176
vt 0.648872 0.080138
vt 0.662959 0.080138
vt 0.662959 0.202176
vt 0.383291 0.211565
vt 0.369245 0.211571
vt 0.369195 0.089879
vt 0.383241 0.089873
vt 0.590058 0.319249
vt 0.604472 0.319249
vt 0.604472 0.444538
vt 0.590058 0.444538
vt 0.825533 0.377029
vt 0.730449 0.281884
vt 0.741846 0.270494
vt 0.730449 0.472051
vt 0.742000 0.483610
vt 0.081527 0.216715
vt 0.067131 0.216715
vt 0.067131 0.091575
vt 0.081527 0.091575
vt 0.073153 0.451489
vt 0.058757 0.451489
vt 0.058757 0.326349
vt 0.073153 0.326349
vt 0.110922 0.450066
vt 0.096509 0.450066
vt 0.096509 0.324777
vt 0.110922 0.324777
vt 0.052146 0.454771
vt 0.052164 0.326382
vt 0.054379 0.326373
vt 0.054368 0.453277
vt 0.056573 0.326363
vt 0.056569 0.452035
vt 0.060520 0.219997
vt 0.060538 0.091607
vt 0.062753 0.091599
vt 0.062742 0.218503
vt 0.064947 0.091588
vt 0.064943 0.217261
vt 0.389729 0.083727
vt 0.389729 0.211523
vt 0.387553 0.211537
vt 0.387527 0.086837
vt 0.385415 0.211551
vt 0.385371 0.089066
vt 0.919985 0.084800
vt 0.919985 0.206838
vt 0.917855 0.206821
vt 0.917855 0.084361
vt 0.915718 0.206803
vt 0.915718 0.083188
vt 0.913561 0.206785
vt 0.913561 0.081588
vt 0.665130 0.324900
vt 0.665174 0.447386
vt 0.667286 0.322671
vt 0.667312 0.447371
vt 0.669488 0.319561
vt 0.669488 0.447357
vt 0.646743 0.202159
vt 0.646743 0.079699
vt 0.644606 0.202141
vt 0.644605 0.078526
vt 0.642448 0.202123
vt 0.642448 0.076928
vt 0.583474 0.444498
vt 0.583474 0.316995
vt 0.585680 0.318115
vt 0.585680 0.444508
vt 0.587872 0.318938
vt 0.587872 0.444521
vt 0.113109 0.324794
vt 0.113109 0.450377
vt 0.115301 0.324807
vt 0.115301 0.451202
vt 0.117507 0.324817
vt 0.117507 0.452320
vt 0.934072 0.084800
vt 0.934072 0.206838
vt 0.354874 0.866937
vt 0.366272 0.855547
vt 0.461355 0.950693
vt 0.449958 0.962083
vt 0.154045 0.330923
vt 0.154095 0.452616
vt 0.140048 0.452621
vt 0.139999 0.330929
vt 0.354721 0.843989
vt 0.449804 0.748966
vt 0.461355 0.760525
vt 0.418646 0.208977
vt 0.418646 0.086938
vt 0.432732 0.086938
vt 0.432732 0.208977
vt 0.641537 0.447400
vt 0.627491 0.447405
vt 0.627441 0.325713
vt 0.641488 0.325707
vt 0.855142 0.083842
vt 0.869556 0.083842
vt 0.869556 0.209131
vt 0.855142 0.209131
vt 0.343323 0.855379
vt 0.248239 0.760233
vt 0.259637 0.748843
vt 0.248239 0.950401
vt 0.259790 0.961959
vt 0.582463 0.444364
vt 0.568066 0.444364
vt 0.568066 0.319224
vt 0.582463 0.319224
vt 0.125009 0.213488
vt 0.110613 0.213488
vt 0.110613 0.088348
vt 0.125009 0.088348
vt 0.361632 0.208715
vt 0.347218 0.208715
vt 0.347218 0.083426
vt 0.361632 0.083426
vt 0.104002 0.216770
vt 0.104020 0.088380
vt 0.106235 0.088372
vt 0.106224 0.215276
vt 0.108429 0.088361
vt 0.108424 0.214034
vt 0.561456 0.447646
vt 0.561474 0.319257
vt 0.563689 0.319248
vt 0.563677 0.446152
vt 0.565882 0.319238
vt 0.565878 0.444910
vt 0.647975 0.319561
vt 0.647975 0.447357
vt 0.645799 0.447371
vt 0.645773 0.322671
vt 0.643661 0.447385
vt 0.643618 0.324900
vt 0.397156 0.086938
vt 0.397156 0.208977
vt 0.395026 0.208959
vt 0.395026 0.086499
vt 0.392889 0.208941
vt 0.392889 0.085325
vt 0.390732 0.208923
vt 0.390731 0.083727
vt 0.156175 0.330116
vt 0.156219 0.452601
vt 0.158331 0.327887
vt 0.158356 0.452587
vt 0.160533 0.324777
vt 0.160533 0.452573
vt 0.416516 0.208960
vt 0.416516 0.086500
vt 0.414379 0.208942
vt 0.414378 0.085326
vt 0.412221 0.208924
vt 0.412221 0.083727
vt 0.848558 0.209091
vt 0.848558 0.081588
vt 0.850764 0.082707
vt 0.850764 0.209101
vt 0.852956 0.083531
vt 0.852956 0.209114
vt 0.363818 0.083443
vt 0.363818 0.209026
vt 0.366010 0.083456
vt 0.366010 0.209850
vt 0.368216 0.083466
vt 0.368216 0.210969
vt 0.411242 0.086938
vt 0.411242 0.208977
vt 0.109611 0.870241
vt 0.121008 0.858851
vt 0.216092 0.953996
vt 0.204694 0.965386
vt 0.906094 0.087735
vt 0.906144 0.209427
vt 0.892097 0.209433
vt 0.892048 0.087741
vt 0.109457 0.847292
vt 0.204541 0.752270
vt 0.216092 0.763828
vt 0.175598 0.324777
vt 0.175598 0.446816
vt 0.161512 0.446816
vt 0.161512 0.324777
vt 0.884631 0.209427
vt 0.870584 0.209433
vt 0.870535 0.087741
vt 0.884581 0.087735
vt 0.619878 0.444850
vt 0.605464 0.444850
vt 0.605464 0.319561
vt 0.619878 0.319561
vt 0.098060 0.858682
vt 0.002976 0.763537
vt 0.014373 0.752147
vt 0.002976 0.953704
vt 0.014527 0.965263
vt 0.103023 0.213488
vt 0.088627 0.213488
vt 0.088627 0.088348
vt 0.103023 0.088348
vt 0.095530 0.449917
vt 0.081134 0.449917
vt 0.081133 0.324777
vt 0.095530 0.324777
vt 0.331817 0.086559
vt 0.346230 0.086559
vt 0.346230 0.211847
vt 0.331817 0.211847
vt 0.074523 0.453199
vt 0.074541 0.324809
vt 0.076756 0.324801
vt 0.076745 0.451705
vt 0.078949 0.324790
vt 0.078945 0.450463
vt 0.082016 0.216770
vt 0.082034 0.088380
vt 0.084249 0.088372
vt 0.084238 0.215276
vt 0.086443 0.088361
vt 0.086439 0.214034
vt 0.891069 0.081588
vt 0.891069 0.209384
vt 0.888893 0.209399
vt 0.888867 0.084699
vt 0.886755 0.209413
vt 0.886711 0.086928
vt 0.131710 0.091551
vt 0.131710 0.213590
vt 0.129580 0.213573
vt 0.129580 0.091113
vt 0.127443 0.213555
vt 0.127443 0.089939
vt 0.125286 0.213537
vt 0.125285 0.088341
vt 0.908224 0.086928
vt 0.908268 0.209413
vt 0.910380 0.084699
vt 0.910405 0.209399
vt 0.912582 0.081588
vt 0.912582 0.209384
vt 0.177728 0.324795
vt 0.177728 0.447254
vt 0.179865 0.324812
vt 0.179865 0.448428
vt 0.182023 0.324830
vt 0.182023 0.450027
vt 0.626462 0.319601
vt 0.626462 0.447104
vt 0.624256 0.445984
vt 0.624256 0.319591
vt 0.622064 0.445161
vt 0.622064 0.319578
vt 0.329630 0.211830
vt 0.329630 0.086248
vt 0.327438 0.211817
vt 0.327439 0.085423
vt 0.325232 0.211807
vt 0.325232 0.084305
vt 0.145796 0.091551
vt 0.145796 0.213590
vn -0.9993 -0.0019 -0.0378
vn -0.9993 0.0378 0.0019
vn -0.9959 0.0640 0.0640
vn -0.9959 -0.0640 -0.0640
vn -0.1440 0.6997 -0.6997
vn -0.1305 0.7011 -0.7011
vn 0.0000 0.7071 -0.7071
vn -0.9993 0.0019 0.0378
vn -0.9914 -0.0923 0.0923
vn -0.9914 0.0923 -0.0923
vn -0.1305 -0.7011 0.7011
vn 0.0000 -0.7071 0.7071
vn -0.1440 -0.6997 0.6997
vn -0.1990 0.6930 0.6930
vn 0.0000 0.7071 0.7071
vn -0.1856 0.6948 0.6948
vn -0.9993 -0.0378 -0.0019
vn 0.0000 -0.7071 -0.7071
vn -0.1990 -0.6930 -0.6930
vn -0.1856 -0.6948 -0.6948
vn -0.9247 -0.2692 -0.2692
vn -0.9771 -0.0423 -0.2083
vn -0.8254 -0.3992 -0.3992
vn -0.3648 -0.6584 -0.6584
vn -0.9247 0.2692 0.2692
vn -0.9771 0.0423 0.2083
vn -0.8254 0.3992 0.3992
vn -0.3648 0.6584 0.6584
vn -0.9659 -0.1830 0.1830
vn -0.9771 -0.2083 -0.0423
vn -0.7071 -0.5000 0.5000
vn -0.5000 -0.6124 0.6124
vn -0.5732 -0.5794 0.5794
vn -0.2588 -0.6830 0.6830
vn -0.2588 0.6830 -0.6830
vn -0.7071 0.5000 -0.5000
vn -0.9659 0.1830 -0.1830
vn -0.9771 0.2083 0.0423
vn -0.5000 0.6124 -0.6124
vn -0.5732 0.5794 -0.5794
vn 0.0000 1.0000 0.0000
vn -0.1296 0.9831 -0.1296
vn -0.1296 0.9831 0.1296
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.1296 0.1296 -0.9831
vn 0.1216 0.4915 -0.8623
vn 0.4473 0.4474 -0.7744
vn 0.4915 0.1216 -0.8623
vn 0.1216 0.8623 -0.4915
vn 0.4474 0.7744 -0.4473
vn 0.1296 0.9831 -0.1296
vn 0.4915 0.8623 -0.1216
vn 0.8623 0.4915 -0.1216
vn 0.7744 0.4473 -0.4474
vn 0.9831 0.1296 -0.1296
vn 0.8623 0.1216 -0.4915
vn 0.1296 -0.9831 -0.1296
vn 0.1216 -0.8623 -0.4915
vn 0.4474 -0.7744 -0.4473
vn 0.4915 -0.8623 -0.1216
vn 0.1216 -0.4915 -0.8623
vn 0.4473 -0.4474 -0.7744
vn 0.1296 -0.1296 -0.9831
vn 0.4915 -0.1216 -0.8623
vn 0.8623 -0.1216 -0.4915
vn 0.7744 -0.4473 -0.4474
vn 0.9831 -0.1296 -0.1296
vn 0.8623 -0.4915 -0.1216
vn 0.9831 0.1296 0.1296
vn 0.8623 0.4915 0.1216
vn 0.7744 0.4473 0.4474
vn 0.8623 0.1216 0.4915
vn 0.4915 0.8623 0.1216
vn 0.4474 0.7744 0.4473
vn 0.1296 0.9831 0.1296
vn 0.1216 0.8623 0.4915
vn 0.1216 0.4915 0.8623
vn 0.4473 0.4474 0.7744
vn 0.1296 0.1296 0.9831
vn 0.4915 0.1216 0.8623
vn 0.9831 -0.1296 0.1296
vn 0.8623 -0.1216 0.4915
vn 0.7744 -0.4473 0.4474
vn 0.8623 -0.4915 0.1216
vn 0.4915 -0.1216 0.8623
vn 0.4473 -0.4474 0.7744
vn 0.1296 -0.1296 0.9831
vn 0.1216 -0.4915 0.8623
vn 0.1216 -0.8623 0.4915
vn 0.4474 -0.7744 0.4473
vn 0.1296 -0.9831 0.1296
vn 0.4915 -0.8623 0.1216
vn -0.1296 0.1296 -0.9831
vn -0.4915 0.1216 -0.8623
vn -0.4473 0.4474 -0.7744
vn -0.1216 0.4915 -0.8623
vn -0.8623 0.1216 -0.4915
vn -0.7744 0.4473 -0.4474
vn -0.9831 0.1296 -0.1296
vn -0.8623 0.4915 -0.1216
vn -0.4915 0.8623 -0.1216
vn -0.4474 0.7744 -0.4473
vn -0.1216 0.8623 -0.4915
vn -0.9831 -0.1296 -0.1296
vn -0.8623 -0.1216 -0.4915
vn -0.7744 -0.4473 -0.4474
vn -0.8623 -0.4915 -0.1216
vn -0.4915 -0.1216 -0.8623
vn -0.4473 -0.4474 -0.7744
vn -0.1296 -0.1296 -0.9831
vn -0.1216 -0.4915 -0.8623
vn -0.1216 -0.8623 -0.4915
vn -0.4474 -0.7744 -0.4473
vn -0.1296 -0.9831 -0.1296
vn -0.4915 -0.8623 -0.1216
vn -0.9831 0.1296 0.1296
vn -0.8623 0.1216 0.4915
vn -0.7744 0.4473 0.4474
vn -0.8623 0.4915 0.1216
vn -0.4915 0.1216 0.8623
vn -0.4473 0.4474 0.7744
vn -0.1296 0.1296 0.9831
vn -0.1216 0.4915 0.8623
vn -0.1216 0.8623 0.4915
vn -0.4474 0.7744 0.4473
vn -0.4915 0.8623 0.1216
vn -0.1296 -0.9831 0.1296
vn -0.1216 -0.8623 0.4915
vn -0.4474 -0.7744 0.4473
vn -0.4915 -0.8623 0.1216
vn -0.1216 -0.4915 0.8623
vn -0.4473 -0.4474 0.7744
vn -0.1296 -0.1296 0.9831
vn -0.4915 -0.1216 0.8623
vn -0.8623 -0.1216 0.4915
vn -0.7744 -0.4473 0.4474
vn -0.9831 -0.1296 0.1296
vn -0.8623 -0.4915 0.1216
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn -0.7071 0.7071 0.0000
vn 0.7071 0.7071 0.0000
vn -0.0379 -0.0019 0.9993
vn 0.0019 0.0379 0.9993
vn 0.0640 0.0640 0.9959
vn -0.0640 -0.0640 0.9959
vn -0.6997 0.6997 0.1440
vn -0.7011 0.7011 0.1305
vn 0.0379 0.0019 0.9993
vn 0.0923 -0.0923 0.9914
vn -0.0923 0.0923 0.9914
vn 0.7011 -0.7011 0.1305
vn 0.7071 -0.7071 0.0000
vn 0.6997 -0.6997 0.1440
vn 0.6930 0.6930 0.1990
vn 0.6948 0.6948 0.1856
vn -0.0019 -0.0379 0.9993
vn -0.7071 -0.7071 0.0000
vn -0.6930 -0.6930 0.1990
vn -0.6948 -0.6948 0.1856
vn -0.2692 -0.2692 0.9247
vn -0.2498 0.0241 0.9680
vn -0.3992 -0.3992 0.8254
vn -0.6584 -0.6584 0.3648
vn 0.2692 0.2692 0.9247
vn 0.2498 -0.0241 0.9680
vn 0.3992 0.3992 0.8254
vn 0.6584 0.6584 0.3648
vn 0.3536 -0.3536 0.8660
vn 0.0241 -0.2498 0.9680
vn 0.5000 -0.5000 0.7071
vn 0.6830 -0.6830 0.2588
vn -0.5794 0.5794 0.5732
vn -0.6124 0.6124 0.5000
vn -0.5000 0.5000 0.7071
vn -0.1830 0.1830 0.9659
vn 0.0423 0.2083 0.9771
vn -0.6830 0.6830 0.2588
vn -0.3536 0.3536 0.8660
vn 0.0378 -0.0019 -0.9993
vn -0.0019 0.0378 -0.9993
vn -0.0640 0.0640 -0.9959
vn 0.0640 -0.0640 -0.9959
vn 0.6997 0.6997 -0.1440
vn 0.7011 0.7011 -0.1305
vn -0.0379 0.0019 -0.9993
vn -0.0923 -0.0923 -0.9914
vn 0.0923 0.0923 -0.9914
vn -0.7011 -0.7011 -0.1305
vn -0.6997 -0.6997 -0.1440
vn -0.6930 0.6930 -0.1990
vn -0.6948 0.6948 -0.1856
vn 0.0019 -0.0378 -0.9993
vn 0.6930 -0.6930 -0.1990
vn 0.6948 -0.6948 -0.1856
vn 0.2692 -0.2692 -0.9247
vn 0.2083 -0.0423 -0.9771
vn 0.3992 -0.3992 -0.8254
vn 0.6584 -0.6584 -0.3648
vn -0.2692 0.2692 -0.9247
vn -0.2498 -0.0241 -0.9680
vn -0.3992 0.3992 -0.8254
vn -0.6584 0.6584 -0.3648
vn -0.1830 -0.1830 -0.9659
vn 0.0423 -0.2083 -0.9771
vn -0.5000 -0.5000 -0.7071
vn -0.6830 -0.6830 -0.2588
vn -0.3535 -0.3536 -0.8660
vn 0.5794 0.5794 -0.5732
vn 0.6124 0.6124 -0.5000
vn 0.5000 0.5000 -0.7071
vn 0.1830 0.1830 -0.9659
vn -0.0423 0.2083 -0.9771
vn 0.9993 -0.0019 0.0378
vn 0.9993 0.0378 -0.0019
vn 0.9959 0.0640 -0.0640
vn 0.9959 -0.0640 0.0640
vn 0.1440 0.6997 0.6997
vn 0.1305 0.7011 0.7011
vn 0.9993 0.0019 -0.0378
vn 0.9914 -0.0923 -0.0923
vn 0.9914 0.0923 0.0923
vn 0.1305 -0.7011 -0.7011
vn 0.1440 -0.6997 -0.6997
vn 0.1990 0.6930 -0.6930
vn 0.1856 0.6948 -0.6948
vn 0.9993 -0.0378 0.0019
vn 0.1990 -0.6930 0.6930
vn 0.1856 -0.6948 0.6948
vn 0.9247 -0.2692 0.2692
vn 0.9771 -0.0423 0.2083
vn 0.8254 -0.3992 0.3992
vn 0.3648 -0.6584 0.6584
vn 0.9247 0.2692 -0.2692
vn 0.9771 0.0423 -0.2083
vn 0.8254 0.3992 -0.3992
vn 0.3648 0.6584 -0.6584
vn 0.9659 -0.1830 -0.1830
vn 0.9771 -0.2083 0.0423
vn 0.7071 -0.5000 -0.5000
vn 0.5000 -0.6124 -0.6124
vn 0.5732 -0.5794 -0.5794
vn 0.2588 -0.6830 -0.6830
vn 0.2588 0.6830 0.6830
vn 0.7071 0.5000 0.5000
vn 0.9659 0.1830 0.1830
vn 0.9771 0.2083 -0.0423
usemtl crate
s 1
f 58/1/1 54/2/2 33/3/3 30/4/4
f 53/5/5 21/6/6 3/7/7 8/8/7
f 50/9/8 13/10/9 22/11/10 54/2/2
f 26/12/6 57/13/5 7/14/7 4/15/7
f 17/16/11 2/17/12 6/18/12 45/19/13
f 53/20/14 8/21/15 9/22/15 34/23/16
f 50/9/8 46/24/17 41/25/4 38/26/3
f 18/27/9 46/24/17 58/1/1 25/28/10
f 5/29/15 49/30/14 37/31/16 12/32/15
f 7/33/18 57/34/19 29/35/20 10/36/18
f 45/37/19 6/38/18 11/39/18 42/40/20
f 50/9/8 54/2/2 58/1/1 46/24/17
f 58/41/1 30/42/4 32/43/21 60/44/22
f 60/44/22 32/43/21 31/45/23 59/46/23
f 59/46/24 31/45/24 29/35/20 57/34/19
f 50/47/8 38/48/3 40/49/25 52/50/26
f 52/50/26 40/49/25 39/51/27 51/52/27
f 51/52/28 39/51/28 37/31/16 49/30/14
f 46/53/17 18/54/9 20/55/29 48/56/30
f 48/56/31 20/55/31 19/57/32 47/58/33
f 47/58/33 19/57/32 17/16/11 45/19/13
f 49/59/13 14/60/11 16/61/34 51/62/34
f 51/62/31 16/61/31 15/63/31 52/64/31
f 52/64/26 15/63/29 13/65/9 50/66/8
f 21/6/6 53/5/5 55/67/35 23/68/35
f 23/68/36 55/67/36 56/69/36 24/70/36
f 24/70/37 56/69/38 54/71/2 22/72/10
f 57/13/5 26/12/6 28/73/39 59/74/40
f 59/74/40 28/73/39 27/75/36 60/76/36
f 60/76/22 27/75/37 25/77/10 58/78/1
f 33/79/3 54/80/2 56/81/38 35/82/25
f 35/82/25 56/81/38 55/83/27 36/84/27
f 36/84/28 55/83/28 53/20/14 34/23/16
f 45/37/19 42/40/20 44/85/24 47/86/24
f 47/86/23 44/85/23 43/87/21 48/88/30
f 48/88/30 43/87/21 41/89/4 46/90/17
f 49/59/13 5/91/12 1/92/12 14/60/11
f 208/93/41 206/94/41 176/95/42 173/96/43
f 130/97/44 108/98/44 195/99/44 189/100/44
f 74/101/45 62/102/45 184/103/45 185/104/45
f 108/105/45 118/106/45 180/107/45 195/99/45
f 162/108/46 63/109/47 65/110/48 64/111/49
f 63/112/47 67/113/50 68/114/51 65/115/48
f 174/116/52 66/117/53 68/114/51 67/113/50
f 66/117/53 70/118/54 71/119/55 68/114/51
f 160/120/56 69/121/57 71/122/55 70/123/54
f 69/121/57 64/111/49 65/110/48 71/122/55
f 65/115/48 68/114/51 71/119/55
f 157/124/58 75/125/59 77/126/60 76/127/61
f 75/125/59 79/128/62 80/129/63 77/126/60
f 159/130/64 78/131/65 80/132/63 79/133/62
f 78/131/65 82/134/66 83/135/67 80/132/63
f 161/136/68 81/137/69 83/135/67 82/134/66
f 81/138/69 76/127/61 77/126/60 83/139/67
f 77/126/60 80/129/63 83/139/67
f 169/140/70 86/141/71 88/142/72 87/143/73
f 86/144/71 90/145/74 91/146/75 88/147/72
f 172/148/76 89/149/77 91/146/75 90/145/74
f 89/149/77 93/150/78 94/151/79 91/146/75
f 166/152/80 92/153/81 94/154/79 93/155/78
f 92/153/81 87/143/73 88/142/72 94/154/79
f 88/147/72 91/146/75 94/151/79
f 168/156/82 98/157/83 100/158/84 99/159/85
f 98/157/83 102/160/86 103/161/87 100/158/84
f 167/162/88 101/163/89 103/161/87 102/160/86
f 101/164/89 105/165/90 106/166/91 103/167/87
f 175/168/92 104/169/93 106/166/91 105/165/90
f 104/169/93 99/170/85 100/171/84 106/166/91
f 100/171/84 103/167/87 106/166/91
f 170/172/94 109/173/95 111/174/96 110/175/97
f 109/176/95 113/177/98 114/178/99 111/179/96
f 171/180/100 112/181/101 114/178/99 113/177/98
f 112/182/101 116/183/102 117/184/103 114/185/99
f 176/95/42 115/186/104 117/184/103 116/183/102
f 115/186/104 110/187/97 111/188/96 117/184/103
f 111/188/96 114/185/99 117/184/103
f 156/189/105 121/190/106 123/191/107 122/192/108
f 121/190/106 125/193/109 126/194/110 123/191/107
f 158/195/111 124/196/112 126/197/110 125/198/109
f 124/199/112 128/200/113 129/201/114 126/202/110
f 153/203/115 127/204/116 129/201/114 128/200/113
f 127/204/116 122/205/108 123/206/107 129/201/114
f 123/206/107 126/202/110 129/201/114
f 165/207/117 132/208/118 134/209/119 133/210/120
f 132/208/118 136/211/121 137/212/122 134/209/119
f 164/213/123 135/214/124 137/212/122 136/211/121
f 135/215/124 139/216/125 140/217/126 137/218/122
f 173/96/43 138/219/127 140/217/126 139/216/125
f 138/219/127 133/220/120 134/221/119 140/217/126
f 134/221/119 137/218/122 140/217/126
f 154/222/128 144/223/129 146/224/130 145/225/131
f 144/223/129 148/226/132 149/227/133 146/224/130
f 163/228/134 147/229/135 149/230/133 148/231/132
f 147/229/135 151/232/136 152/233/137 149/230/133
f 155/234/138 150/235/139 152/233/137 151/232/136
f 150/236/139 145/225/131 146/224/130 152/237/137
f 146/224/130 149/227/133 152/237/137
f 153/203/115 154/222/128 145/225/131 127/204/116
f 127/204/116 145/225/131 150/236/139 122/205/108
f 122/192/108 150/235/139 155/234/138 156/189/105
f 157/124/58 153/203/115 128/200/113 75/125/59
f 75/125/59 128/200/113 124/199/112 79/128/62
f 79/133/62 124/196/112 158/195/111 159/130/64
f 160/120/56 161/136/68 82/134/66 69/121/57
f 69/121/57 82/134/66 78/131/65 64/111/49
f 64/111/49 78/131/65 159/130/64 162/108/46
f 163/228/134 164/213/123 136/211/121 147/229/135
f 147/229/135 136/211/121 132/208/118 151/232/136
f 151/232/136 132/208/118 165/207/117 155/234/138
f 166/152/80 167/162/88 102/160/86 92/153/81
f 92/153/81 102/160/86 98/157/83 87/143/73
f 87/143/73 98/157/83 168/156/82 169/140/70
f 170/172/94 158/195/111 125/198/109 109/173/95
f 109/176/95 125/193/109 121/190/106 113/177/98
f 113/177/98 121/190/106 156/189/105 171/180/100
f 172/148/76 173/96/43 139/216/125 89/149/77
f 89/149/77 139/216/125 135/215/124 93/150/78
f 93/155/78 135/214/124 164/213/123 166/152/80
f 174/116/52 172/148/76 90/145/74 66/117/53
f 66/117/53 90/145/74 86/144/71 70/118/54
f 70/123/54 86/141/71 169/140/70 160/120/56
f 154/222/128 175/168/92 105/165/90 144/223/129
f 144/223/129 105/165/90 101/164/89 148/226/132
f 148/231/132 101/163/89 167/162/88 163/228/134
f 173/96/43 176/95/42 116/183/102 138/219/127
f 138/219/127 116/183/102 112/182/101 133/220/120
f 133/210/120 112/181/101 171/180/100 165/207/117
f 176/95/42 174/116/52 67/113/50 115/186/104
f 115/186/104 67/113/50 63/112/47 110/187/97
f 110/175/97 63/109/47 162/108/46 170/172/94
f 175/168/92 157/124/58 76/127/61 104/169/93
f 104/169/93 76/127/61 81/138/69 99/170/85
f 99/159/85 81/137/69 161/136/68 168/156/82
f 73/238/41 119/239/41 182/240/41 183/241/41
f 120/242/44 141/243/44 154/222/128 153/203/115
f 143/244/140 118/245/140 156/189/105 155/234/138
f 72/246/44 120/242/44 153/203/115 157/124/58
f 119/247/141 73/248/141 159/130/64 158/195/111
f 62/249/142 74/250/142 161/136/68 160/120/56
f 73/248/141 61/251/141 162/108/46 159/130/64
f 142/252/45 131/253/45 164/213/123 163/228/134
f 130/254/140 143/244/140 155/234/138 165/207/117
f 85/255/45 96/256/45 167/162/88 166/152/80
f 95/257/142 84/258/142 169/140/70 168/156/82
f 107/259/141 119/247/141 158/195/111 170/172/94
f 118/245/140 108/260/140 171/180/100 156/189/105
f 207/261/141 204/262/141 196/263/141 197/264/141
f 131/253/45 85/255/45 166/152/80 164/213/123
f 202/265/45 205/266/45 200/267/45 198/268/45
f 84/258/142 62/249/142 160/120/56 169/140/70
f 141/243/44 97/269/44 175/168/92 154/222/128
f 96/256/45 142/252/45 163/228/134 167/162/88
f 205/270/142 207/271/142 197/264/142 200/267/142
f 108/260/140 130/254/140 165/207/117 171/180/100
f 203/272/41 208/93/41 173/96/43 172/148/76
f 61/251/141 107/259/141 170/172/94 162/108/46
f 97/269/44 72/246/44 157/124/58 175/168/92
f 74/250/142 95/257/142 168/156/82 161/136/68
f 177/273/44 181/274/44 199/275/44 178/276/44
f 179/277/140 189/100/140 195/99/140 180/107/140
f 191/278/45 190/279/45 188/280/45 187/281/45
f 198/268/41 200/267/41 197/264/41 196/263/41
f 185/104/142 184/103/142 193/282/142 192/283/142
f 182/240/141 194/284/141 186/285/141 183/241/141
f 61/286/140 73/287/140 183/241/140 186/285/140
f 206/94/41 201/288/41 174/116/52 176/95/42
f 85/289/44 131/290/44 188/280/44 190/279/44
f 131/291/142 142/292/142 187/281/142 188/280/142
f 107/293/44 61/294/44 186/285/44 194/284/44
f 201/288/41 203/272/41 172/148/76 174/116/52
f 143/295/141 130/296/141 189/100/141 179/277/141
f 72/297/140 97/298/140 199/275/140 181/274/140
f 141/299/142 120/300/142 177/273/142 178/276/142
f 62/301/44 84/302/44 193/282/44 184/103/44
f 96/303/140 85/304/140 190/279/140 191/278/140
f 95/305/41 74/306/41 185/104/41 192/283/41
f 118/307/41 143/308/41 179/277/41 180/107/41
f 97/309/141 141/310/141 178/276/141 199/275/141
f 84/311/141 95/312/141 192/283/141 193/282/141
f 120/313/45 72/314/45 181/274/45 177/273/45
f 142/315/41 96/316/41 191/278/41 187/281/41
f 119/317/142 107/318/142 194/284/142 182/240/142
f 204/262/7 207/261/7 208/319/7 203/320/7
f 202/321/143 204/322/143 203/323/143 201/324/143
f 207/271/144 205/270/144 206/325/144 208/326/144
f 205/266/15 202/265/15 201/327/15 206/328/15
f 204/322/140 202/321/140 198/268/140 196/263/140
f 266/329/145 262/330/146 241/331/147 238/332/148
f 261/333/149 229/334/150 211/335/143 216/336/143
f 258/337/151 221/338/152 230/339/153 262/330/146
f 234/340/150 265/341/149 215/342/143 212/343/143
f 225/344/154 210/345/155 214/346/155 253/347/156
f 261/348/157 216/349/144 217/350/144 242/351/158
f 258/337/151 254/352/159 249/353/148 246/354/147
f 226/355/152 254/352/159 266/329/145 233/356/153
f 213/357/144 257/358/157 245/359/158 220/360/144
f 215/361/160 265/362/161 237/363/162 218/364/160
f 253/365/161 214/366/160 219/367/160 250/368/162
f 258/337/151 262/330/146 266/329/145 254/352/159
f 266/369/145 238/370/148 240/371/163 268/372/164
f 268/372/164 240/371/163 239/373/165 267/374/165
f 267/374/166 239/373/166 237/363/162 265/362/161
f 258/375/151 246/376/147 248/377/167 260/378/168
f 260/378/168 248/377/167 247/379/169 259/380/169
f 259/380/170 247/379/170 245/359/158 257/358/157
f 254/381/159 226/382/152 228/383/171 256/384/172
f 256/384/172 228/383/171 227/385/173 255/386/173
f 255/386/174 227/385/174 225/344/154 253/347/156
f 257/387/156 222/388/154 224/389/174 259/390/174
f 259/390/173 224/389/173 223/391/171 260/392/168
f 260/392/168 223/391/171 221/393/152 258/394/151
f 229/334/150 261/333/149 263/395/175 231/396/176
f 231/396/176 263/395/175 264/397/177 232/398/177
f 232/398/178 264/397/179 262/399/146 230/400/153
f 265/341/149 234/340/150 236/401/180 267/402/180
f 267/402/177 236/401/177 235/403/181 268/404/164
f 268/404/164 235/403/181 233/405/153 266/406/145
f 241/407/147 262/408/146 264/409/179 243/410/167
f 243/410/167 264/409/179 263/411/169 244/412/169
f 244/412/170 263/411/170 261/348/157 242/351/158
f 253/365/161 250/368/162 252/413/166 255/414/166
f 255/414/165 252/413/165 251/415/163 256/416/172
f 256/416/172 251/415/163 249/417/148 254/418/159
f 257/387/156 213/419/155 209/420/155 222/388/154
f 326/421/182 322/422/183 301/423/184 298/424/185
f 321/425/186 289/426/187 271/427/144 276/428/144
f 318/429/188 281/430/189 290/431/190 322/422/183
f 294/432/187 325/433/186 275/434/144 272/435/144
f 285/436/191 270/437/160 274/438/160 313/439/192
f 321/440/193 276/441/143 277/442/143 302/443/194
f 318/429/188 314/444/195 309/445/185 306/446/184
f 286/447/189 314/444/195 326/421/182 293/448/190
f 273/449/143 317/450/193 305/451/194 280/452/143
f 275/453/155 325/454/196 297/455/197 278/456/155
f 313/457/196 274/458/155 279/459/155 310/460/197
f 318/429/188 322/422/183 326/421/182 314/444/195
f 326/461/182 298/462/185 300/463/198 328/464/199
f 328/464/199 300/463/198 299/465/200 327/466/200
f 327/466/201 299/465/201 297/455/197 325/454/196
f 318/467/188 306/468/184 308/469/202 320/470/203
f 320/470/203 308/469/202 307/471/204 319/472/204
f 319/472/205 307/471/205 305/451/194 317/450/193
f 314/473/195 286/474/189 288/475/206 316/476/207
f 316/476/208 288/475/208 287/477/208 315/478/208
f 315/478/209 287/477/209 285/436/191 313/439/192
f 317/479/192 282/480/191 284/481/209 319/482/209
f 319/482/208 284/481/208 283/483/210 320/484/203
f 320/484/203 283/483/210 281/485/189 318/486/188
f 289/426/187 321/425/186 323/487/211 291/488/212
f 291/488/212 323/487/211 324/489/213 292/490/213
f 292/490/214 324/489/215 322/491/183 290/492/190
f 325/433/186 294/432/187 296/493/212 327/494/211
f 327/494/211 296/493/212 295/495/213 328/496/213
f 328/496/199 295/495/214 293/497/190 326/498/182
f 301/499/184 322/500/183 324/501/215 303/502/202
f 303/502/202 324/501/215 323/503/204 304/504/204
f 304/504/205 323/503/205 321/440/193 302/443/194
f 313/457/196 310/460/197 312/505/201 315/506/201
f 315/506/200 312/505/200 311/507/198 316/508/207
f 316/508/207 311/507/198 309/509/185 314/510/195
f 317/479/192 273/511/160 269/512/160 282/480/191
f 386/513/216 382/514/217 361/515/218 358/516/219
f 381/517/220 349/518/221 331/519/15 336/520/15
f 378/521/222 341/522/223 350/523/224 382/514/217
f 354/524/221 385/525/220 335/526/15 332/527/15
f 345/528/225 330/529/18 334/530/18 373/531/226
f 381/532/227 336/533/7 337/534/7 362/535/228
f 378/521/222 374/536/229 369/537/219 366/538/218
f 346/539/223 374/536/229 386/513/216 353/540/224
f 333/541/7 377/542/227 365/543/228 340/544/7
f 335/545/12 385/546/230 357/547/231 338/548/12
f 373/549/230 334/550/12 339/551/12 370/552/231
f 378/521/222 382/514/217 386/513/216 374/536/229
f 386/553/216 358/554/219 360/555/232 388/556/233
f 388/556/233 360/555/232 359/557/234 387/558/234
f 387/558/235 359/557/235 357/547/231 385/546/230
f 378/559/222 366/560/218 368/561/236 380/562/237
f 380/562/237 368/561/236 367/563/238 379/564/238
f 379/564/239 367/563/239 365/543/228 377/542/227
f 374/565/229 346/566/223 348/567/240 376/568/241
f 376/568/242 348/567/242 347/569/243 375/570/244
f 375/570/244 347/569/243 345/528/225 373/531/226
f 377/571/226 342/572/225 344/573/245 379/574/245
f 379/574/242 344/573/242 343/575/242 380/576/242
f 380/576/237 343/575/240 341/577/223 378/578/222
f 349/518/221 381/517/220 383/579/246 351/580/246
f 351/580/247 383/579/247 384/581/247 352/582/247
f 352/582/248 384/581/249 382/583/217 350/584/224
f 385/525/220 354/524/221 356/585/246 387/586/246
f 387/586/247 356/585/247 355/587/247 388/588/247
f 388/588/233 355/587/248 353/589/224 386/590/216
f 361/591/218 382/592/217 384/593/249 363/594/236
f 363/594/236 384/593/249 383/595/238 364/596/238
f 364/596/239 383/595/239 381/532/227 362/535/228
f 373/549/230 370/552/231 372/597/235 375/598/235
f 375/598/234 372/597/234 371/599/232 376/600/241
f 376/600/241 371/599/232 369/601/219 374/602/229
f 377/571/226 333/603/18 329/604/18 342/572/225

Edited 2020-12-10 07:21 by PeteCotton
 
JohnS
Guru

Joined: 18/11/2011
Location: United Kingdom
Posts: 4044
Posted: 07:10pm 10 Dec 2020
Copy link to clipboard 
Print this post

Someone has redefined what .OBJ means?

Seriously?

WHY????

There are so many other names which could have been chosen.

John
 
PeteCotton

Guru

Joined: 13/08/2020
Location: Canada
Posts: 543
Posted: 07:20pm 10 Dec 2020
Copy link to clipboard 
Print this post

  JohnS said  Someone has redefined what .OBJ means?

Seriously?

WHY????

There are so many other names which could have been chosen.

John


It appears to have been around since 1995. It is weird though that the programmers who wrote the original software (Lightwave) didn't notice the conflict (unless they compiled to .o object files?). I guess it's up to the user to be aware as to whether you are compiling code or trying to do 3D modelling.
 
vegipete

Guru

Joined: 29/01/2013
Location: Canada
Posts: 1132
Posted: 07:38pm 10 Dec 2020
Copy link to clipboard 
Print this post

  PeteCotton said  I have the .OBJ loader "working". I use Quotes because there still appears to be some issue with the objects, but that might just be the order in which the primitives, that make it up, are loaded. In the crate object below you can see that some of the struts are missing. I'm not sure why that is, I'll try and investigate this weekend. They do re-appear as they rotate to the front of the object.

I think this is just the nature of the beast. The painter's algorithm draws faces from farthest to nearest. But it is possible for a large face to have a nearer centroid than a smaller face that should cover part of the larger one.

Consider this:

The two visible green faces should cover (part of) the red face. However, the centroid (black dot) of the red face is closer than the centroids of both green faces and therefore is drawn after the green faces, hiding (or mostly hiding) them.

Breaking large faces into smaller ones might be the only solution.
Visit Vegipete's *Mite Library for cool programs.
 
qwerty823
Newbie

Joined: 30/07/2020
Location: United States
Posts: 30
Posted: 07:57pm 10 Dec 2020
Copy link to clipboard 
Print this post

https://en.wikipedia.org/wiki/Painter%27s_algorithm#Limitations

You describe the overlapping case (though not cyclical). There is also an issue of "piercing" faces (where faces intersect).

Seems we need a z-buffer, and let the renders do a z-buffer depth test. :)

Although another option would be to split faces on overlaps and intersections and generate new vertices and faces as needed to make painters algo work.
 
PeteCotton

Guru

Joined: 13/08/2020
Location: Canada
Posts: 543
Posted: 09:26pm 10 Dec 2020
Copy link to clipboard 
Print this post

  vegipete said  
  PeteCotton said  .....In the crate object below you can see that some of the struts are missing. I'm not sure why that is, I'll try and investigate this weekend. They do re-appear as they rotate to the front of the object.

I think this is just the nature of the beast. The painter's algorithm draws faces from farthest to nearest. But it is possible for a large face to have a nearer centroid than a smaller face that should cover part of the larger one.
....


Ah, thank you. I think you have hit the nail on the head (and thanks for the nice and clear diagram).

  vegipete said  
Breaking large faces into smaller ones might be the only solution.

  qwerty823 said  Although another option would be to split faces on overlaps and intersections and generate new vertices and faces as needed to make painters algo work.


Yes. I think this is probably the easiest solution. For most objects which just have an outer skin (like the Elite ships), this isn't going to be an issue. It looks like Blender and MeshLab both have the ability to generate the outer skin mesh and not include any hidden surfaces.

https://blenderartists.org/t/creating-an-outer-shell-on-a-mesh/670239
 
mkopack73
Senior Member

Joined: 03/07/2020
Location: United States
Posts: 261
Posted: 01:19am 11 Dec 2020
Copy link to clipboard 
Print this post

VERY useful! Great that you're doing this!

I gotta say, the ecosystem for this machine is really starting to flesh out nicely!
 
Print this page


To reply to this topic, you need to log in.

The Back Shed's forum code is written, and hosted, in Australia.
© JAQ Software 2025